【问题标题】:Django ORM: Join to queryset models with foreign keyDjango ORM:使用外键加入查询集模型
【发布时间】:2014-01-29 07:44:42
【问题描述】:

我需要获取所有公司的列表并以最少的companyuser id 加入公司用户。 有两种型号:

class Company(models.Model):
    name = models.CharField(max_length=255)
    kind = models.CharField(max_length=255)

class CompanyUser(models.Model):
    company = models.ForeignKey('Company')
    email = models.EmailField(max_length=40, unique=True)
    #other fields

我尝试过这样的事情:

companies = Company.objects.all().select_related(Min('companyuser__email'))

但它不起作用。我怎样才能用 Django ORM 做到这一点?没有原始 SQL 有什么办法吗?

【问题讨论】:

  • minimal id 是什么意思?
  • 我的意思是数据库中的最小 id。 companyuser.id
  • id 是系统自动分配的,您不应该依赖它来订购或其他目的。您是否尝试按用户数对公司排序?

标签: django django-orm


【解决方案1】:
from django.db.models import Min
Company.objects.annotate(lowest_companyuser_id=Min("companyuser__id"))

说明

select_related() 可用于告诉 Django 应将哪些相关表连接到生成的查询集以减少查询数量,即在遍历查询集并在迭代中访问相关对象时解决可怕的“N+1 问题” . (see docs)

使用Min() 是正确的,但它应该与annotate() 查询集方法一起使用。将annotate()Min()Max()Count() 等聚合表达式一起使用会在使用上述GROUP BY 聚合表达式之一的SQL 查询中进行转换。 (见docs about annotate() in Django,关于GROUP BY in Postgres docs

【讨论】:

  • 虽然这段代码 sn-p 可以解决问题,including an explanation 确实有助于提高您的帖子质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,这会降低代码和解释的可读性!
【解决方案2】:

正如布尔汉所说 - 不要依赖 pk,但如果你必须......

companies = Company.objects.all().order_by('pk')[0]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-27
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 2019-10-13
    • 1970-01-01
    • 2020-04-20
    相关资源
    最近更新 更多