DRF - 在PrimaryKeyRelatedField中过滤查询集

时间:2017-10-30 07:50:28

标签: python django django-rest-framework

我有以下型号:

class ModelX(models.Model):

    STATUS_CHOICES = (
        (0, 'ABC'),
        (1, 'DEF'),
    )
    status = models.IntegerField(choices=STATUS_CHOICES)
    user = models.ForeignKey(Users)


class Users(models.Model):
    phone_number = models.Charfield()

和ModelX的序列化程序是:

class ModelXSerializer(serializers.ModelSerializer):
    phone_number = serializers.PrimaryKeyRelatedField(
        source='user', queryset=Users.objects.get(phone_number=phone_number))

    class Meta:
        model = ModelX
        fields = ('phone_number',)

在创建ModelX记录的请求中,我得到phone_number而不是user_id。现在,我要触发过滤查询以获取user实例。我该怎么做,即Users.objects.get(phone_number=phone_number)

此外,创建记录时,status字段将始终为0。客户端不会在正文中发布status参数。它的内在逻辑。 serializers中是否有办法可以自动将status字段设置为0请不要建议将此字段设置为默认值= 0 。这背后有一些逻辑。这只是问题陈述的较短版本。

2 个答案:

答案 0 :(得分:2)

您可以使用自定义create方法尝试此类版本的序列化程序:

class ModelXSerializer(serializers.ModelSerializer):
    phone_number = serializers.serializers.CharField(source='user.phone_number')

    class Meta:
        model = ModelX
        fields = ('phone_number',)

    def create(self, validated_data):
        phone_number = validated_data['phone_number']
        user = Users.objects.get(phone_number=phone_number)
        instance = ModelX.objects.create(status=0, user=user)
        return instance

有关source参数的详细信息。

答案 1 :(得分:1)

您可以在validate功能中添加

class ModelXSerializer(serializers.ModelSerializer):

    def validate(self, attrs):
        attrs = super(ModelXSerializer, self).validate(attrs)
        attrs['status'] = 0
        return attrs