【问题标题】:Get Django admin.ModelAdmin to display join of two tables获取 Django admin.ModelAdmin 以显示两个表的连接
【发布时间】:2019-05-23 17:54:08
【问题描述】:

我有一个带有以下 models.py 的 Django 应用

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。

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    据我所知,您不能直接在OrderAdmin 中显示OrderItems。但是您可以在OrderItemAdmin 中显示Order,或者使用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'
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    相关资源
    最近更新 更多