【问题标题】:How to access column from another table in list_display?如何从 list_display 中的另一个表访问列?
【发布时间】:2019-09-17 19:46:13
【问题描述】:

我有这些模型:

class Orders(models.Model):
    order_id = models.AutoField(primary_key=True)
    user_id = models.IntegerField()
    status = models.CharField(max_length=100)
    created_at = models.CharField(max_length=100)

    class Meta:
        managed = False
        db_table = 'orders'

class OrderItems(models.Model):
    order_id = models.ForeignKey(Orders, models.DO_NOTHING)
    quantity = models.IntegerField()

    class Meta:
        managed = False
        db_table = 'order_items'

现在假设我希望 orders 模型的 list_display 显示列

order_id, user_id, status, created_at, quantity

我知道我可以这样做:

class OrdersAdmin(admin.ModelAdmin):

list_display = ('id', 'user_id', 'status', 'created_at', 'get_quantity')

class Meta:
    model = Orders

def get_quantity(self, obj):
    result = XXX
    return result.get('quantity')

get_quantity.short_description = 'Quantity'

admin.site.register(Order, OrderAdmin)

如何通过XXX 访问我需要的信息?

【问题讨论】:

  • 一个订单有多个order_items,你想显示多少?
  • 例如 order_id 为 1。
  • 我的意思是订单-> order_items 是一对多的关系。 order_id = 1 的 order_items 可以有很多。你想要所有数量的总和吗?
  • 另外你的模型是如何定义的? order_id 是 OrderItem 上的 ForeignKey 吗?
  • 你应该展示模型而不是数据库表的图片。

标签: django django-models django-forms django-views django-admin


【解决方案1】:

因此,您需要遵循 Orders 的反向外键集(顺便说一句,应该以单数形式命名)。 所以是这样的:

orderitems = obj.orderitems_set.all()
sum = 0
for orderitem in orderitems:
    sum = sum + orderitem.quantity
return sum   

你可以设置related_name重命名反向集:

OrderItems(models.Model):
    order_id = models.ForeignKey(Orders, models.DO_NOTHING, related_name="order_items")

并称它为order.order_items.all()

在 OrdersAdmin 中订购:

def get_queryset(self,request):
    qs = super(OrdersAdmin,self).get_queryset(request)
    return qs.annotate(get_quantity=Sum('order_items__quantity'))

def get_quantity(self, obj):
    return obj.order_items.all.aggregate(Sum('quantity'))


get_quantity.admin_order_field = 'get_quantity'

【讨论】:

  • 如果我将五行放入 OrdersAdmin(admin.ModelAdmin) 类中的函数中,我会收到错误消息:'Orders' 对象没有属性 'orderitems_set'。
  • 您可以尝试在您的 OrderItems 模型中设置 related_name 吗?然后您可以将第一行替换为orderitems = obj.related_name。那应该可以。
  • 现在我得到错误:'OrdersAdmin' object has no attribute 'related_name'
  • 啊,我的意思是这样的:OrderItems(models.Model): order_id = models.ForeignKey(Orders, models.DO_NOTHING, related_name="order_items") 然后使用orderitems = obj.order_items
  • 看起来更好,但它不起作用。它告诉我:'RelatedManager' object is not iterable。如果我想迭代,我可能需要 all() 方法。
猜你喜欢
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多