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))