【发布时间】:2020-02-05 10:08:49
【问题描述】:
所以我有这个查询,我需要重新过滤以从不同的仪表 id 中获取最大的 take_at 字段的值,但我无法让 django orm's/sql 部分进行此查询。
<QuerySet [<Reading: [127] meter installation: 29, type: 1, taken: 2019-10-07 16:06:48.101453+00:00 value: 78.0000, comment: , VAT: 22.00>, <Reading: [126] meter installation: 41, type: 2, taken: 2019-10-07 14:05:32.415905+00:00 value: 7.0000, comment: asdfe, VAT: None>, <Reading: [125] meter installation: 41, type: 2, taken: 2019-10-07 14:02:37.588983+00:00 value: 7.0000, comment: asdfe, VAT: None>, <Reading: [124] meter installation: 49, type: 2, taken: 2019-10-07 12:19:49.067398+00:00 value: 8.0000, comment: , VAT: 2.00>
这个查询包含很多 Reading 对象,但我只需要从不同的仪表安装中获取最大的 take_at 值,我尝试制作注释然后 distinct ,但它们没有一起实现,我对 SQL 有点陌生所以任何帮助都会很棒!
阅读.py
class Reading(DateTrackedModel):
meter_installation = models.ForeignKey(
"MeterInstallation",
on_delete=models.PROTECT,
related_name="readings",
null=False,
blank=False,
verbose_name=_("Meter Installation"),
)
value = models.DecimalField(
decimal_places=4, max_digits=10, null=False, blank=False, default=0, verbose_name=_("Value")
)
price = models.DecimalField(
decimal_places=4, max_digits=10, null=False, blank=False, default=0, verbose_name=_("Price")
)
reading_type = models.ForeignKey(
"MeterType",
on_delete=models.PROTECT,
null=False,
blank=False,
related_name="readings",
verbose_name=_("Reading type"),
)
comment = models.TextField(null=False, blank=True, verbose_name=_("Comment"))
taken_at = models.DateTimeField(null=False, default=now, blank=False, verbose_name=_("Taken at"))
VAT = models.DecimalField(decimal_places=2, max_digits=10, null=True, blank=True, verbose_name=_("VAT"))
unit_name = models.CharField(max_length=100, null=False, blank=True, unique=False, verbose_name=_("Unit name"))
unit_price = models.DecimalField(
decimal_places=4, max_digits=10, null=False, blank=False, default=0.0, verbose_name=_("Unit price")
)
仪表安装型号:
class MeterInstallation(ActiveAfterUntilModel, DateTrackedModel, MPTTModel, NamedModel): # type: ignore
meter_type = models.ForeignKey(
MeterType,
on_delete=models.PROTECT,
null=False,
blank=False,
related_name="installations",
verbose_name=_("Meter Installation type"),
)
parent = TreeForeignKey(
"self", on_delete=models.CASCADE, null=True, blank=True, related_name="children", db_index=True
)
meter = models.ForeignKey(
Meter, on_delete=models.PROTECT, related_name="installations", null=False, blank=False, verbose_name=_("Meter")
)
building = models.ForeignKey(
Building,
on_delete=models.PROTECT,
related_name="meter_installations",
null=True,
blank=False,
verbose_name=_("Building"),
)
places = models.ManyToManyField(Place, related_name="meter_installations", blank=False, verbose_name=_("Places"))
initial_reading = models.DecimalField(
decimal_places=4, max_digits=10, null=False, blank=False, default=0, verbose_name=_("Initial reading")
)
final_reading = models.DecimalField(
decimal_places=4, max_digits=10, null=True, blank=True, verbose_name=_("Final reading")
)
【问题讨论】:
标签: python sql django django-orm django-filter