【发布时间】:2021-06-06 13:21:52
【问题描述】:
我想在 Django 管理中使用“前提”模型输出一个表。此外,我想在此表的附加列中包含输出,例如“最后一次公用事业付款”。它实际上是相关表中的一列。数据库中可能没有付款,因此管理员应该能够看到一个空单元格或付款日期。
我能够编写一个数据库查询来显示我需要的信息。其重要和工作的部分如下:
SELECT jp.id,
jp.number apartment,
jp.building_number building,
jp.rent,
jp.arrears,
jpm.last_payment
FROM jasmin_premises jp
LEFT JOIN (
SELECT pm.premises_id,
max(pm.paid) last_payment
FROM jasmin_payment pm
GROUP BY pm.premises_id
) jpm ON jp.id = jpm.premises_id;
并且输出类似于以下内容:
id | apartment | building | rent | arrears | last_payment
--------------------------------------------------------------
170 | 1X | 6-A | 297.43 | 2.57, | NULL
72 | 2 | 4 | 289.66 | -678.38 | 2021-01-31
173 | 3Z | 7 | 432.86 | 515.72 | 2021-02-04
73 | 4 | 8-B | 292.25 | 515.44 | 2021-02-04
74 | 5 | 8-B | 112.42 | 3249.34 | NULL
75 | 6A | 122 | 328.48 | 386.23 | 2021-02-04
76 | 7 | 42 | 482.06 | 964.12 | 2021-01-31
77 | 8 | 1 | 433.71 | 867.42 | 2021-01-31
78 | 9C | 12 | 322.79 | 322.79 | 2021-02-04
79 | 10 | 122 | 324.22 | 0 | 2021-02-04
80 | 12 | 12 | 322.79 | 1232.46 | NULL
81 | 14 | 5-Z | 440.82 | 978.44 | 2021-02-04
我正在使用以下模型(仅占重要部分):
class Premises(models.Model):
number = models.CharField(
blank=False,
null=False,
max_length=10)
building_number = models.CharField(
blank=False,
null=False,
max_length=3)
rent = models.DecimalField(
blank=False,
null=False,
max_digits=12,
decimal_places=2,
default=0.0)
area = models.DecimalField(
blank=False,
null=False,
max_digits=5,
decimal_places=2)
class Payment(models.Model):
paid = models.DateField(
blank=False,
null=False)
premises = models.ForeignKey(
Premises,
blank=False,
null=False,
on_delete=models.CASCADE,
related_name='payments',
db_index=True)
有没有办法覆盖admin.ModelAdmin.get_queryset(例如使用注释)来获得一个额外的列,就像我上面的例子一样?有没有其他方法可以使用 Django ORM 对复合 DB 查询进行 LEFT JOIN?
【问题讨论】:
-
您好,先生,我不知道在 django admin 中显示这个是否是最好的方式,因为它变得更加复杂,我认为您应该创建一个 html 模板来显示这些信息,如果您选择了这个最后一个选项,我会帮你的。
-
@Luiz 问题是使用 Django ORM 进行单个数据库查询。在这种情况下,它是管理站点还是其他地方并不那么重要
标签: django django-models django-admin django-queryset django-orm