from rest_framework import serializers from basic_info import models as basic_models class BaseSerializer(serializers.ModelSerializer): merchant = serializers.PrimaryKeyRelatedField( queryset=basic_models.Merchant.objects.all(), required=False # 创建时由视图层设置 ) def to_representation(self, instance): try: merchant = self.context['request'].user.employee.merchant if instance.merchant != merchant: # 数据保护手段 raise PermissionError("无权限访问该对象") except (KeyError, AttributeError): # TODO: log something? raise PermissionError("无权限访问该对象") result = super().to_representation(instance) if self.context.get('expand_merchant', False): result['merchant'] = { 'id': instance.merchant.id, 'name': instance.merchant.name } return result class QuickInputSerializer(serializers.ModelSerializer): class Meta: model = basic_models.QuickInput fields = ['name', 'value', 'group'] class ProductCategorySerializer(BaseSerializer): class Meta: model = basic_models.ProductCategory fields = '__all__' class ProductSerializer(BaseSerializer): class Meta: model = basic_models.Product fields = '__all__' def to_representation(self, instance): result = super().to_representation(instance) result['category'] = { 'id': instance.category.id, 'name': instance.category.name } return result class WareHouseSerializer(BaseSerializer): class Meta: model = basic_models.WareHouse fields = '__all__' class SupplierSerializer(BaseSerializer): class Meta: model = basic_models.Supplier fields = '__all__' class EmployeeSerializer(BaseSerializer): class Meta: model = basic_models.Employee fields = '__all__' class CustomerSerializer(BaseSerializer): created_by = serializers.PrimaryKeyRelatedField( queryset=basic_models.Employee.objects.all(), required=False, ) class Meta: model = basic_models.Customer fields = '__all__' class VehicleTypeSerializer(BaseSerializer): class Meta: model = basic_models.VehicleType fields = '__all__' class BankAccountSerializer(BaseSerializer): class Meta: model = basic_models.BankAccount fields = '__all__' class DeviceInfoSerializer(BaseSerializer): class Meta: model = basic_models.DeviceInfo fields = '__all__' class VehicleTransportRecordSerializer(BaseSerializer): vehicle_type_name = serializers.CharField(source='vehicle_type.name', read_only=True) class Meta: model = basic_models.VehicleTransportRecord fields = '__all__' depth = 1 # 展开外键关系