我重写FormSerializer的update方法。如有必要,它将某些嵌套字段记录标记为is_deprecated。但是,即使我的get_queryset过滤掉了is_deprecated的所有内容,Api调用也会返回所有记录。据我所知,正在调用get_queryset以获取实例,然后将该实例传递给序列化器。该实例不包含任何以前不推荐使用的记录。
update方法完成后,看起来必须运行另一个查询才能获取所有这些嵌套记录并对其进行序列化。这仅在更新时发生。当调用self.perform_update()时,将序列化程序保存在UpdateModelMixin.update()中时,可能会发生这种情况。
我在标准GET请求中获得了正确的记录。是否知道在哪里调用第二个查询以及如何覆盖它?另外,我应该能够在to_representation中编辑序列化的数据,但是这样做效率不高,我想先了解一下这里发生的情况。
查看
class FormViewSet(LoginRequiredMixin, viewsets.ModelViewSet): serializer_class = FormSerializer queryset = Form.objects.all() def get_queryset(self): if 'pk' in self.kwargs: qs = Form.objects.filter(id=self.kwargs['pk']) else: qs = Form.objects.filter(id__in=name_dict.values()).order_by('name') queryset = FormSerializer.eager_loading(qs) return queryset
序列化器
class FormSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(required=False, allow_null=True)
fields = FieldSerializer(many=True)
class Meta:
model = Form
fields = '__all__'
@staticmethod
def eager_loading(queryset):
return queryset.prefetch_related(Prefetch('fields',queryset=Field.objects.filter(is_deprecated=False).order_by('field_order')))
我重写FormSerializer的update方法。如有必要,它将某些嵌套字段记录标记为is_deprecated。但是,即使我的get_queryset过滤掉了...,Api调用也会返回所有记录...
我认为,此答案应为评论,但信誉不足。