Как получить доступ к столбцу из другой таблицы в list_display? - PullRequest
1 голос
/ 29 апреля 2019

У меня есть эти модели:

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'

Теперь предположим, что я хочу list_display модели orders для отображения столбцов

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?

1 Ответ

2 голосов
/ 29 апреля 2019

Таким образом, вы должны следовать обратному внешнему ключу, установленному для 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'
...