如何在序列化程序中更改ManyToManyField名称

时间:2019-03-25 12:04:47

标签: django django-rest-framework

我想更改ManyToManyField名称。 user_groups是manytomanyfield。我尝试使用ManyToManyRelatedField和PrimaryKeyRelatedField,但是它给出了错误。我应该如何更改字符类型或我要给CharField

的数据类型?
class EmployeeProfileSerializer(serializers.ModelSerializer):
    employee_id = serializers.CharField(source='user_employee_id')
    payroll_id = serializers.CharField(source='user_payroll_id')
    phone = serializers.CharField(source='user_phone')
    hire_date = serializers.DateField(source='user_hire_date')
    pay_rate = serializers.IntegerField(source='user_pay_rate')
    salaried = serializers.CharField(source='user_salaried')
    excempt = serializers.CharField(source='user_excempt')
    state = serializers.CharField(source='user_state')
    city = serializers.CharField(source='user_city')
    zipcode = serializers.IntegerField(source='user_zipcode')
    status = serializers.CharField(source='user_status')

    class Meta:
        model = UserProfile
        fields = [  
                    'employee_id',
                    'phone', 
                    'payroll_id',
                    'hire_date',
                    'pay_rate',
                    'salaried',
                    'excempt',
                    'state',
                    'city',
                    'zipcode', 
                    'status',
                    'user_groups',

                ]

1 个答案:

答案 0 :(得分:1)

您可以使用SerializerMethodField

class EmployeeProfileSerializer(serializers.ModelSerializer):
    ...
    your_custom_name = SerializerMethodField()

    class Meta:
        model = UserProfile
        fields = ['your_custom_name ', ...]

    def get_your_custom_name(self, obj):
        # Return ids:
        return list(obj.user_groups.all().values_list('pk', flat=True))
        # Or using a serializer:
        return MyUserGroupSerializer(obj.user_groups.all(), many=True).data

对于创建和更新,您必须覆盖createupdate方法以分配新字段:

class EmployeeProfileSerializer(serializers.ModelSerializer):
    ...
    your_custom_name = IntegerField()

    class Meta:
        model = UserProfile
        fields = ['your_custom_name', ...]

    # If you need validation
    def validate_your_custom_name(self, value):
        if value:
            if int(value) > 5:
                return value
        return None

    def create(self, validated_data):
        # Get the data for your new field
        my_costum_data = validated_data.get('your_custom_name')

        # Do something with it
        profile_obj = UserProfile.objects.create(...)
        if my_costum_data:
            user_group = UserGroupModel.objects.get(pk=int(my_costum_data))
            profile_obj.user_groups.add(user_group)

    def update(self, instance, validated_data):
        # Same as create()
        ...