Django ORM:使用外键加入查询集模型

时间:2014-01-29 07:44:43

标签: django django-orm

我需要获取所有公司的列表,并以最小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,有没有办法做到这一点?

2 个答案:

答案 0 :(得分:0)

from django.db.models import Min
Company.objects.annotate(lowest_companyuser_id=Min("companyuser__id"))

解释

select_related()可用于告诉Django哪些相关表应该连接到结果查询集以减少查询数量,即在循环查询集和访问相关对象时解决可怕的“N + 1问题”在迭代中。 (see docs

使用Min()时,您处于正确的轨道,但它应该与annotate() queryset方法一起使用。将annotate()Min()Max()Count()等聚合表达式一起使用,可以使用前面提到的GROUP BY聚合表达式之一在SQL查询中进行转换。 (参见docs about annotate() in Django,关于GROUP BY in Postgres docs

答案 1 :(得分:-1)

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

companies = Company.objects.all().order_by('pk')[0]
相关问题