Django - 如何为字段组合与查询集仅获取 2 个对象
Posted
技术标签:
【中文标题】Django - 如何为字段组合与查询集仅获取 2 个对象【英文标题】:Django - How to get only 2 object for a combination of fields with a queryset 【发布时间】:2010-11-21 20:59:48 【问题描述】:如果我有
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。
【问题讨论】:
我认为您可能正在寻找更好的独特支持,目前尚不可用,但有一个补丁:code.djangoproject.com/ticket/6422 【参考方案1】:你想在一些过滤后找到最新的 Model 对象吗?对象 id 是什么意思?是外键吗?还是django自动生成的Model id?我猜是后者。在这种情况下,您可以只使用 id。这可能会对您有所帮助(我假设您的模型中至少有这些字段: content_object, dateField ):
Model.objects.filter(content_object=foo,id=N).order_by(dateField)[0]
编辑:
我很抱歉。好吧,这个问题一开始并不清楚这个(我是一个新手)。这是一种幼稚的方法(我认为您想要独特):
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
【讨论】:
为此添加长度检查,否则如果它与任何对象都不匹配,它将爆炸。 很好,这确实是目前最好的答案。如果有任何更有效的方法(不把所有东西都放在内存/python_objects 中)那就更好了。但是,可以找到解决方案,谢谢。以上是关于Django - 如何为字段组合与查询集仅获取 2 个对象的主要内容,如果未能解决你的问题,请参考以下文章