63 lines
2.3 KiB
Python
63 lines
2.3 KiB
Python
import re
|
|
|
|
from rest_framework import serializers
|
|
from .models import Factory, COOPERATION_MODE_CHOICES
|
|
|
|
|
|
USCC_PATTERN = re.compile(r'^[0-9A-Z]{18}$')
|
|
|
|
|
|
class FactorySerializer(serializers.ModelSerializer):
|
|
"""
|
|
工厂序列化器
|
|
"""
|
|
material_count = serializers.SerializerMethodField()
|
|
usernames = serializers.SerializerMethodField()
|
|
cooperation_mode_display = serializers.CharField(source='get_cooperation_mode_display', read_only=True)
|
|
unified_social_credit_code = serializers.CharField(
|
|
required=True, allow_null=False, allow_blank=False, max_length=18
|
|
)
|
|
cooperation_mode = serializers.ChoiceField(
|
|
choices=COOPERATION_MODE_CHOICES, required=True, allow_null=False, allow_blank=False
|
|
)
|
|
|
|
class Meta:
|
|
model = Factory
|
|
fields = ['id', 'dealer_name', 'product_category', 'factory_name',
|
|
'short_name', 'unified_social_credit_code',
|
|
'cooperation_mode', 'cooperation_mode_display',
|
|
'interaction_capability',
|
|
'province', 'city', 'district',
|
|
'address', 'website', 'created_at', 'updated_at',
|
|
'material_count', 'usernames']
|
|
read_only_fields = ['id', 'created_at', 'updated_at', 'material_count',
|
|
'usernames', 'cooperation_mode_display']
|
|
|
|
def get_material_count(self, obj):
|
|
return obj.materials.count()
|
|
|
|
def get_usernames(self, obj):
|
|
return list(obj.users.values_list('username', flat=True))
|
|
|
|
def validate_unified_social_credit_code(self, value):
|
|
if not USCC_PATTERN.match(value or ''):
|
|
raise serializers.ValidationError('统一社会信用代码必须为 18 位数字或大写字母')
|
|
return value
|
|
|
|
|
|
class FactoryListSerializer(serializers.ModelSerializer):
|
|
"""
|
|
工厂列表序列化器(简化版)
|
|
"""
|
|
usernames = serializers.SerializerMethodField()
|
|
cooperation_mode_display = serializers.CharField(source='get_cooperation_mode_display', read_only=True)
|
|
|
|
class Meta:
|
|
model = Factory
|
|
fields = ['id', 'factory_name', 'short_name', 'province', 'city',
|
|
'dealer_name', 'usernames',
|
|
'cooperation_mode', 'cooperation_mode_display']
|
|
|
|
def get_usernames(self, obj):
|
|
return list(obj.users.values_list('username', flat=True))
|