2009-08-22 22 views
2

如果我有Django的 - 如何获得只有2场的组合对象与查询集

Model.objects.all() 

我想只有一个对象的任何content_object = FOO,OBJECT_ID = N。我怎样才能做到这一点?假设我正在通过-datetime进行订购。如果我可以在任何content_type = foo,object_id = N的查询集中只有一个对象...它应该是最新的..如何指定我只想要1个对象的任何组合的content_object和object_id?

class CheckIn(models.Model): 
    ... 
    owner = models.ForeignKey('auth.User') 
    datetime = models.DateTimeField(editable=False, auto_now=True) 

    ... 
    # This is the object that should be geocoded, hopefully 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey() 

    class Meta: 
     ordering=('-datetime',) 

然后采取查询集:

checkins = CheckIn.objects.filter(
     datetime__gte=datetime.datetime.now() - 
     datetime.timedelta(hours=24), 
) 

这可以给我所有的签入的过去24小时内,但我只想要1个对象PER CONTENT_TYPE = foo和OBJECT_ID = N。

+0

我想你可能会寻找更好独特的支持,这是当前不可用,但有它补丁: HTTP: //code.djangoproject.com/ticket/6422 – mikl 2009-08-22 08:32:45

回答

3

你想查找最新的型号对象经过一些过滤?对象ID是什么意思?它是一个外键吗?或者它是由django自动生成的Model id?我想这是后者。在这种情况下,您只能使用ID。这可能会帮助你(我假设你至少有这些模型中的字段:content_object,的DateField):

Model.objects.filter(content_object=foo,id=N).order_by(dateField)[0] 

编辑:

我道歉。那么,这个问题不是这个明确的开头(和我am一个newb)。这里是一个天真的做法(我想你想不同):

d={} 
[d.setdefault(str(a.content_type)+str(a.object_id),a) for a in checkins ] 
d.values() # this gives your desired list of distinct objects 
+3

为此添加一个长度检查,否则如果它不匹配任何对象,它将炸毁。 – 2009-08-22 08:18:59

+0

很好,这确实是现在最好的答案。如果有更有效的方法(不是把所有东西放在内存/ python_objects中),它会更好。但是,回来的解决方案,谢谢。 – 2009-08-23 15:29:33