如何在没有外键关系的情况下在list_display中显示另一个表中的列?

def*_*foe 1 django django-models django-forms django-admin django-views

我有这些数据库关系:

数据库关系

现在,在我admin.py的中,list_display我想显示订单表以及 order_items 中的数量行。为此,我将使用以下 sql 查询:

SELECT
    order_id, quantity 
FROM
    orders
INNER JOIN
        order_items
    ON
        orders.order_id = order_items.order_id;
Run Code Online (Sandbox Code Playgroud)

现在我不知道如何在不使用原始查询的情况下使用 django 以正确的方式执行此操作。

那么我要在行中添加什么

list_display = ('order_id')

为了显示数量行?

ala*_*263 5

为了获取特定相关订单的 order_items 数量,请编写以下代码 -

>>> from django.db.models import Sum
>>> order.order_items_set.aggregate(quantity=Sum('quantity'))
Run Code Online (Sandbox Code Playgroud)

它会返回一个类似的字典 -{'quantity': 3} 请参阅此处以获取有关聚合的更多信息

为了在您的订单管理模型中显示它 -

class OrderAdmin(admin.ModelAdmin):
    list_display = ('id', 'user_id', 'status', 'created_at', 'get_quantity')

    class Meta:
        model = Order

    def get_quantity(self, obj):
        result = obj.order_items_set.aggregate(quantity=Sum('quantity'))
        return result.get('quantity',0)

    get_quantity.short_description = 'Quantity'

admin.site.register(Order, OrderAdmin)
Run Code Online (Sandbox Code Playgroud)

请参阅此处了解有关 django-admin 自定义的更多信息。