我有以下代码来注释Item.name
所代表的ItemSale
。它可以正常工作,并且除此视图外的所有GET都可以调用200个以上的ItemSale
对象,如果我理解正确,那么这还意味着200个查询只是为了获取每个ItemSales
的{{1}}?如果是这样,我正在寻找一种更有效的方法。
ItemSale序列化器:
Item.name
销售序列化器:
class ItemSaleSerializer(serializers.ModelSerializer):
item_name = serializers.SerializerMethodField()
class Meta:
model = models.ItemSale
fields = ['quantity', 'price', 'item_name']
def get_item_name(self, obj):
return obj.item.name
我尝试为class SaleSerializer(serializers.ModelSerializer):
item_sales = ItemSaleSerializer(many=True, source='itemsale_set')
class Meta:
model = models.Sale
fields = ('id', 'uid', 'dt_date', 'total', 'item_sales')
创建一个自定义管理器并通过ItemSale
注释额外的字段,但是似乎没有被调用,因为在这种情况下,all()
的列表是被嵌套
答案 0 :(得分:2)
您需要做的就是为queryset提供预提取的数据,因此您认为例如:
def get_queryset(self):
return ItemSale.objects.select_related('item')
这将使JOIN到Item表,并在一个查询中获取所有结果。
答案 1 :(得分:1)
对于charField
,您也可以使用item_name
,并将'item.name'
用作源。