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 个对象的主要内容,如果未能解决你的问题,请参考以下文章

Django:如何为 MySQL VARBINARY HEX 字段建模?

如何为 Datatable 获取正确的查询集

如何为缺少的数据组合添加行并将相应的字段估算为 0

Django:更改查询集中所有对象的字段值

如何为性能索引字段?

Django Rest Framework - 如何为所有 ModelSerializer 字段创建自定义错误消息?