mat/backend/apps/factory/serializers.py

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