我是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
关系的最佳实践感兴趣。任何见解都将不胜感激。
答案 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
!