2016-02-12 67 views
1

我有一张仅用于插入的表格。它具有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?

+0

我没有提到以前,但我使用MySQL的这个项目,所以我无法使用distinct()。 –

回答

1

请试试这个:

from django.db.models import Max 

Model.objects.filter(user_id=100).values('object_id').annotate(Max('id')) 
+0

我相信这与我所寻找的内容非常接近,但我想我可能已经抽象了一些,试图简化我的问题。该表还有其他字段,我希望这是返回模型对象而不是字典。我传递给它的表单使用__unicode__方法来知道要在表单上显示的内容。 –

+0

我最终只是这样做来创建一个ID列表,然后将它提供给第二个查询上的过滤器。 不漂亮,但它的作品。 –

+0

对不起回到这个晚了,但是,你可以在ID列表中使用'__in'。我以为你想保留最大ID,但听起来不是这样,所以这是完美的。 –

0

如果我给你正确的表结构是:

---------------------------- 
|   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秒,并且由于distinctobject_id只为彼此相同object_id的第一个记录下令将采取,它与指定的排序将是最高的id

+0

不幸的是,我不得不在这个项目上使用MySQL,所以distinct()对我来说是不可用的。 –