获取Django admin.ModelAdmin以显示两个表的联接

时间:2019-05-23 17:54:08

标签: python django django-models

我有一个具有以下模型的Django应用。py

from django.db import models

class Order(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    email = models.EmailField()
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    paid = models.BooleanField(default=False)
    delivered = models.BooleanField(default=False)


class OrderItem(models.Model):
    order = models.ForeignKey(Order,
                              related_name='items',
                              on_delete=models.CASCADE)
    product = models.ForeignKey(Product,
                                related_name='order_items',
                                on_delete=models.CASCADE)
    price = models.DecimalField(max_digits=10, decimal_places=2)

在我的admin.py中,我有这个

from django.contrib import admin

@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
    list_display = ['id', 'first_name', 'last_name', 'email',
                    'paid', 'delivered']
    list_filter = ['paid', 'delivered']

这仅显示“订单”表。

我想将Order与OrderItem表联接起来,并在Django管理员中显示它。我不确定这是否相关,但是对于一个订单,可能有很多OrderItem。

1 个答案:

答案 0 :(得分:0)

据我所知,您无法直接在OrderItem中显示OrderAdmin。但是您可以在Order中显示OrderItemAdmin,或使用InLineModelAdminOrder详细信息页面中显示OrderItems。像这样:

class OrderItemInline(admin.TabularInline):
    model = OrderItem

class OrderAdmin(admin.ModelAdmin):
    inlines = [
        OrderItemInline,
    ]

如果您仍想在管理页面中显示OrderItems(或订单项的一部分),则可以在list_display字段中添加一个方法,然后使用该方法来获取OrderItems。像这样:

class OrderAdmin(admin.ModelAdmin):
    list_display = (..., 'get_order_items')

    def get_order_items(self, obj):
        return return ", ".join(obj.items.values_list("pk", flat=True))
    get_order_items.short_description = 'Order Items'