基本上,我有一个带有一堆外键的表,并且试图通过“创建的”字段仅查询特定键的第一次出现。以Blog / Entry示例为例,如果Entry模型具有Blog的外键和User的外键,那么我如何构造查询以选择特定用户在其中为各个Blog编写第一个条目的所有条目?

class Blog(models.Model):
    ...

class User(models.Model):
    ...

class Entry(models.Model):
    blog = models.Foreignkey(Blog)
    user = models.Foreignkey(User)


我认为选择博客的第一个条目是我所缺少的,我可以通过追加附加内容来简单地过滤到特定用户:

query = Entry.objects.magicquery.filter(user=user)


但是也许还有其他更有效的方法。谢谢!

最佳答案

query = Entry.objects.filter(user=user).order_by('id')[0]

基本上按ID排序(从最低到最高),然后对其进行切片,以仅从QuerySet中获得第一个匹配。

我现在没有可用的Django安装来测试我的产品线,因此,如果我有上述类型,请检查文档:

order by

limiting querysets

顺便说一下,有关“限制queysets”手册部分的有趣注释:


  而是检索单个对象
  而不是列表(例如SELECT foo FROM bar
  LIMIT 1),请改用简单索引
  一片例如,这返回
  数据库中的第一个条目,之后
  按字母顺序排序条目
  标题:
  
  Entry.objects.order_by('headline')[0]


编辑:好的,这是迄今为止我能提出的最好的建议(在您和我的评论之后)。它不返回Entry对象,但其ID为entry_id

query = Entry.objects.values('blog').filter(user=user).annotate(Count('blog')).annotate(entry_id=Min('id'))

我会继续寻找更好的方法。

10-08 09:46
查看更多