有没有比SerializerMethodField更有效的字段注释方法?

时间:2019-06-06 07:37:59

标签: django django-rest-framework

我有以下代码来注释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()的列表是被嵌套

2 个答案:

答案 0 :(得分:2)

您需要做的就是为queryset提供预提取的数据,因此您认为例如:

def get_queryset(self):
    return ItemSale.objects.select_related('item')

这将使JOIN到Item表,并在一个查询中获取所有结果。

答案 1 :(得分:1)

对于charField,您也可以使用item_name,并将'item.name'用作源。

相关问题