【发布时间】:2021-03-03 12:13:49
【问题描述】:
我的对象在 mariaDB 上有这个布局(这里没有 postgres):
+------+------------------------------+----------+---------+--------------------------------------------+
| id | created | message | from | guest_id |
+------+------------------------------+----------+---------+--------------------------------------------+
| '45' | '2021-03-02 21:32:56.756966' | 'Hello ' | 'host' | 'e5b15b726e1224ca1d70ad9cf6a6e2a485de5478' |
| '46' | '2021-03-02 23:32:56.756966' | 'bye' | 'guest' | 'e5b15b726e1224ca1d70ad9cf6a6e2a485de5478' |
| '47' | '2021-03-02 24:32:56.756966' | 'still ' | 'guest' | 'a7c3bdf1adc0e9f821f8727e83e76ae3821cf47e' |
| '48' | '2021-03-03 00:32:56.756966' | 'here ' | 'host' | 'a7c3bdf1adc0e9f821f8727e83e76ae3821cf47e' |
+------+------------------------------+----------+---------+--------------------------------------------+
如您所见,我对每个 guest_id 有两个结果,我希望只有最新“创建”的最后一个结果:
+------+------------------------------+---------+---------+--------------------------------------------+
| id | created | message | from | guest_id |
+------+------------------------------+---------+---------+--------------------------------------------+
| '46' | '2021-03-02 23:32:56.756966' | 'bye' | 'guest' | 'e5b15b726e1224ca1d70ad9cf6a6e2a485de5478' |
| '48' | '2021-03-03 00:32:56.756966' | 'here ' | 'host' | 'a7c3bdf1adc0e9f821f8727e83e76ae3821cf47e' |
+------+------------------------------+---------+---------+--------------------------------------------+
这是我想出的:
queryaux = Message.objects.filter(guest__reservation__home=home).values('guest_id').distinct().order_by()
queryset = Message.objects.filter(guest__in=queryaux).latest('created')
queryaux 包含我需要的元素集(没有重复),但只有 guest_id,而不是完整对象(因为 values())
queryset应该有对应的对象,但它只获取一个对象,集合中最新的一个
我的解决方案(使用迭代器和查询集的串联 - 可能不快):
pseudo-code:
for elem in queryset:
final_queryset += Message.objects.filter(guest=elem).latest('created')
你有什么建议以正确的方式做到这一点?
谢谢。
编辑: 为了完整起见,这是消息模型:
class Message(models.Model):
guest = models.ForeignKey(Guest, related_name='messages', on_delete=models.CASCADE)
created = models.DateTimeField(default=timezone.now)
message = models.CharField(max_length=512)
msgfrom = models.CharField(max_length=1,choices=MSGFROM)
class Meta:
ordering = ['created']
【问题讨论】:
标签: django django-rest-framework