如何使用Django ORM从子查询中进行选择?
我有一张仅用于插入的表格。它具有id,object_id和user_id的列。更新记录时,不是更新行,而是使用匹配的object_id创建新记录。如何使用Django ORM从子查询中进行选择?
我想拉配合每一个人的object_id最高的ID给定user_ID的所有记录。
我能做什么,我试图用像这样子查询来形容:
SELECT * FROM (SELECT * FROM table WHERE user_id = 100 ORDER BY object_id, id DESC) adr_table GROUP BY object_id
我使用.RAW()方法试过,但它返回一个RawQuerySet对象,我想将其提供给需要QuerySet的表单。
我希望摆脱.raw(),只使用Django ORM,但如果这是不可能的,我怎么能将RawQuerySet转换为常规的QuerySet?
请试试这个:
from django.db.models import Max
Model.objects.filter(user_id=100).values('object_id').annotate(Max('id'))
我相信这与我所寻找的内容非常接近,但我想我可能已经抽象了一些,试图简化我的问题。该表还有其他字段,我希望这是返回模型对象而不是字典。我传递给它的表单使用__unicode__方法来知道要在表单上显示的内容。 –
我最终只是这样做来创建一个ID列表,然后将它提供给第二个查询上的过滤器。 不漂亮,但它的作品。 –
对不起回到这个晚了,但是,你可以在ID列表中使用'__in'。我以为你想保留最大ID,但听起来不是这样,所以这是完美的。 –
如果我给你正确的表结构是:
----------------------------
| Table |
----------------------------
| id | user_id | object_id |
----------------------------
| 1 | 100 | 10 |
----------------------------
| 2 | 100 | 20 |
----------------------------
| 3 | 200 | 80 |
----------------------------
| 4 | 100 | 80 |
----------------------------
| 5 | 100 | 10 |
----------------------------
和您的查询的结果应该是:
----------------------------
| Table |
----------------------------
| id | user_id | object_id |
----------------------------
| 4 | 100 | 80 |
----------------------------
| 2 | 100 | 20 |
----------------------------
| 5 | 100 | 10 |
----------------------------
然后试着distinct(),如下所示:
Model.objects.filter(user_id=100).order_by('-object_id', '-id').distinct('object_id')
这应该与user_id
等于100返回QuerySet
与你的记录,然后通过object_id
第一和降序id
秒,并且由于distinct
上object_id
只为彼此相同object_id
的第一个记录下令将采取,它与指定的排序将是最高的id
。
不幸的是,我不得不在这个项目上使用MySQL,所以distinct()对我来说是不可用的。 –
我没有提到以前,但我使用MySQL的这个项目,所以我无法使用distinct()。 –