Serializer根据任意属性过滤关系

时间:2017-10-30 16:54:11

标签: django django-rest-framework

我是DRF的新手,我有什么工作,但如果有更好的方法,我感兴趣:

我有一个PrimaryKeyRelatedField序列化程序来枚举多对多关系。它工作正常,即:

mobile_forms = serializers.PrimaryKeyRelatedField(
  allow_empty=True,
  many=True,
  queryset=MobileForm.objects.all(),
  required=False)

我的问题是,对于这种关系,我总是只想要将已删除状态设置为False的相关项目返回。为了实现这一点,我正在做:

active_mobile_forms = serializers.SerializerMethodField()
def get_active_mobile_forms(self, obj):
         return obj.mobile_forms.filter(Q(deleted=False)).values_list('pk',flat=True)

我不得不创建一个单独的序列化程序来过滤返回的对象。基于我对queryset的{​​{1}}参数的理解用于验证输入,因此不适合在此处进行过滤。

基本上,我对通过序列化程序返回对象时过滤PrimaryKeyRelatedField关系的最佳实践感兴趣。任何见解都将不胜感激。

1 个答案:

答案 0 :(得分:2)

如果您查看SerializerMethodField的源代码,其主要功能是重载to_representation以合并您刚设置的新get方法:

    def to_representation(self, value):
        method = getattr(self.parent, self.method_name)
        return method(value)

因此,如果您不想使用SerializerMethodField,您可以根据自己的喜好自行重载序列化程序上的to_representation。类似的东西:

class MySerializer(serializers.ModelSerializer):

    mobile_forms = serializers.PrimaryKeyRelatedField(many=True)

    def to_representation(self, instance):
        representation = super().to_representation(instance)
        representation['mobile_forms'] = [x for x in representation['mobile_forms'] if {arbitrary_characteristic}]
        return representation

编辑添加:不要忘记return representation