我有一个名为 ABC 的模态和一个名为 GROUP 的字段,它是一个外键,并且这个模型 Abc 也在另一个模型 XYZ 中用作外键。
我的要求是,当我使用诸如(whse="01" 和 abc="02")之类的过滤器查看 XYZ 列表时,我想要获取组的名称(来自模型 abc)以及 XYZ 模型的列表数据。
class ABC(models.Model):
group = models.ForeignKey(Group, on_delete=models.CASCADE)
class XYZ(models.Model):
abc = models.ForeignKey(ABC, on_delete=models.CASCADE)
whse = models.ForeignKey(WHSE, on_delete=models.CASCADE)
qty = models.CharField()
我现在所做的是 - 在序列化器中定义一个 SerializerMethodField() 字段。
这是代码 -
class XYZSerializer(serializers.ModelSerializer):
groupName = serializers.SerializerMethodField()
def get_groupName(self, instance):
return instance.abc.group.name if instance.abc else ''
class Meta:
model = ZYX
fields = '__all__'
我得到了我想要的结果,但是您可以看到我的过滤要求在 XYZ 模型上始终是 (whse="01" 和 abc="02"),因此 get_groupName 的值对于我的每个请求始终保持不变(我的 abc 在输出列表中始终相同,组名也是如此)。
我如何格式化我的数据,序列化器以减少每个列表项的数据库查询(查找组名)?
編輯 - 編輯 -
这是我的观点
class XYZ_View(generics.ListAPIView):
permission_classes = [IsAuthenticated]
serializer_class = XYZSerializer
def get_queryset(self):
abcId = self.request.GET.get('abc')
whseId = self.request.GET.get('whse')
if abcId and whseId is not None:
qs = ZYX.objects.filter(abc = itemId, whse = whseId)
return qs
return ZYX.objects.none()
你可以
Group
使用[Django-doc]获取它:.select_related(…)
您可以将序列化程序重写为: