首页 > 解决方案 > 将`select_related`与具有复合主键的表一起使用[Django]

问题描述

有没有办法让 Django 支持组合select_related或组合的复合主键prefetch_related

我有一个带有复合主键(device_id,created)的 Records 表,其架构如下(简化):

class Records(models.Model):
    class Meta:
        managed = False
        unique_together = (("device", "created"),)

    # The primary key is really (device_id, created)
    device = models.ForeignKey("hardware.Device", primary_key=True, on_delete=models.CASCADE)
    created = models.DateTimeField(db_index=True)
    value = models.FloatField(default=0)

一条记录属于一个设备,它的建模如下(简化):

class Device(models.Model):
    car = models.ForeignKey("cars.Car", on_delete=models.CASCADE)
    last_record_at = models.DateTimeField(null=True, blank=True)

我希望运行一个返回设备列表的查询,但每个设备还包含最后一条记录。

理论上,这将是这样的:

Device.objects.filter(...).select_related("car", "last_record")

但显然“last_record”不是外键,因为 Records 包含 Django 不支持的复合主键。

除了用原始 sql 重写查询之外,最好的方法是什么?是否有合理的方法来覆盖 select_related 以处理复合键?

标签: djangodjango-models

解决方案


推荐阅读