Python 通过序列化程序django访问属性

Python 通过序列化程序django访问属性,python,django,Python,Django,我有以下型号: class OrderItem(models.Model): ordered_amount = models.IntegerField(validators=[MinValueValidator(0)]) amount = models.IntegerField(default=0) order = models.ForeignKey( Order, on_delete=models.CASCADE, related_name="orde

我有以下型号:

class OrderItem(models.Model):
    ordered_amount = models.IntegerField(validators=[MinValueValidator(0)])
    amount = models.IntegerField(default=0)

    order = models.ForeignKey(
        Order, on_delete=models.CASCADE, related_name="order_items"
    )

class Order(models.Model):
    reference = models.CharField(max_length=50)
    purchase_order = models.CharField(max_length=15, blank=True, null=True)
我现在正在编写一个用于列出订单的序列化程序。在这个OrderSerializer中,我需要访问OrderItem类中的amount和ordered_amount。我该怎么做? 这就是我现在拥有的:

class AdminOrderListSerializer(serializers.ModelSerializer):
    amount = serializers.IntegerField()
    ordered_amount = serializers.IntegerField()

    class Meta:
        model = Order
        fields = [
            "purchase_order",
            "reference",
            "amount",
            "ordered_amount",
        ]

    # noinspection PyMethodMayBeStatic
    def validate_amount(self, order):
        if order.order_items.amount:
            return order.order_items.amount
        return

    # noinspection PyMethodMayBeStatic
    def validate_ordered_amount(self, order):
        if order.order_items.ordered_amount:
            return order.order_items.ordered_amount
        return
这给了我以下错误:

AttributeError:在尝试获取序列化程序上的字段
金额
的值时,获取了AttributeError。 序列化程序字段的名称可能不正确,并且与
Order
实例上的任何属性或键都不匹配。
最初的异常文本是:“订单”对象没有属性“金额”。

有很多方法可以做到这一点,其中之一是:

优化解 实现这一点的另一种方法是将数据发送到queryset,并在序列化程序中访问它们。为此,您需要在视图中进行更改:

class SomeView(ListAPIView):
    queryset = Order.objects.annotate(amount=Sum('order_items__amount'),order_amount=Sum('order_items__order_amount'))

这是一个优化的解决方案,因为它减少了数据库命中率(只命中一次)。

嘿,谢谢你的帮助!您为优化的解决方案编辑了序列化程序。不正确吗?不正确,没有必要。如果字段的名称与带注释的键匹配,则实际上不需要source属性(我编写了该属性,后来删除了该属性)来访问带注释的值。您可以使用已编写的序列化程序。
class SomeView(ListAPIView):
    queryset = Order.objects.annotate(amount=Sum('order_items__amount'),order_amount=Sum('order_items__order_amount'))