【发布时间】:2019-03-08 13:00:23
【问题描述】:
我想在 django 中执行这个查询:
For each sensor, select it's latest message
在 SQL 中是这样的
SELECT * FROM (SELECT * FROM messages order by date_entered DESC) as order GROUP BY sensor_id
模型是这样定义的
class BaseModel(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
date_entered = models.DateTimeField(auto_now_add=True)
date_modified = models.DateTimeField(auto_now=True)
deleted = models.IntegerField(default=0)
class Meta:
abstract = True
ordering = ['date_modified']
class Device(BaseModel):
user = models.ForeignKey(User, on_delete=models.SET_NULL, blank=True, null=True)
name = models.CharField(max_length=255, blank=False)
identifier = models.CharField(max_length=31, blank=False)
imei = models.CharField(max_length=31, blank=False)
status = models.CharField(max_length=31, blank=False)
settings = models.TextField()
class DeviceMessage(BaseModel):
device = models.ForeignKey(Device, on_delete=models.SET_NULL, blank=True, null=True)
user = models.ForeignKey(User, on_delete=models.SET_NULL, blank=True, null=True)
latitude = models.DecimalField(max_digits=9, decimal_places=6, blank=True, null=True)
longitude = models.DecimalField(max_digits=9, decimal_places=6, blank=True, null=True)
altitude = models.DecimalField(max_digits=7, decimal_places=2, blank=True, null=True)
signal_strength = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
battery = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
satellites = models.IntegerField(blank=True, null=True)
size = models.IntegerField(blank=True, null=True)
raw = models.TextField(blank=True, null=True)
在 django 中可以实现吗?
基本上就是这个问题Using ORDER BY and GROUP BY together
【问题讨论】:
-
在 SQL 中不会是这样的。
-
当然有可能,实际上非常简单。假设您在两个模型之间有关系(可能是
ForeignKey)。我们当然需要看看你的模型是什么样子的。 -
我添加了模型的定义
-
谢谢。我注意到您的模型并非都直接从
models.Model扩展而来,而是从您的BaseModel扩展而来。我自己从未真正这样做过,如果您打算这样做,建议您阅读文档here。 (特别是,如果 - 似乎很可能 - 您的BaseModel仅存在以节省您手动将这些字段添加到每个模型的时间,并且不应代表其自己的数据库表,您可能希望将其设为 Abstract 基类。 )