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