【问题标题】:Django: getting FIRST item that belongs to a model object in a ManyToManyFieldDjango:在ManyToManyField中获取属于模型对象的第一个项目
【发布时间】:2013-06-08 18:35:42
【问题描述】:

有一个模型po 和一个名为ManyToManyFieldOrder

我正在考虑一些选项,包括以下解决方案:

po.Orders.all()[0].itemname

但我不确定这个解决方案是否会很昂贵(或不会?)基本上它查询整个表然后过滤掉第一个项目。

第二个解决方案

po.Orders.get(pk=1).itemname

这个看起来更便宜,但不起作用,因为它不可能事先知道pk

我想知道是否有其他解决方案可以获得与po 对象具有多对多关系的任何项目?

【问题讨论】:

  • 您的第一个解决方案非常理想。它对查询执行LIMIT,因此非常有效
  • 我建议使用.first()。两年前,这不是 Django 的 ORM 的一部分。这应该比您的第一个选项更快,并且在您的第二个选项中做您想做的事情。

标签: django model many-to-many


【解决方案1】:

使用[0] 查询整个表是不正确的。如文档中所述,对查询集进行切片会将 LIMIT/OFFSET 传递给数据库查询,因此非常有效。

【讨论】:

    【解决方案2】:

    .first() 是 Django 开发版本中的新功能。查看文档:https://docs.djangoproject.com/en/dev/ref/models/querysets/#first

    直到它变得稳定,或者你运行开发版本,坚持你所拥有的。 QuerySet 是惰性的,并且“应该”采用最少工作的方法。如果您担心,请查看MySql General Log 中的查询日志。

    (来自文档)

    注意 first() 是一个方便的方法,下面的代码示例 相当于上面的例子:

    尝试:
    p = Article.objects.order_by('title', 'pub_date')[0]
    除了 IndexError:
    p = 无

    【讨论】:

      猜你喜欢
      • 2014-05-13
      • 2018-10-16
      • 2021-10-30
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      • 2012-11-21
      • 2018-06-06
      • 2012-03-05
      相关资源
      最近更新 更多