将一系列外国钥匙串在一起,以返回Django中的表值



如何选择CTYPE知道用户?

models.py:

from django.contrib.auth.models import User
class CompanyType(models.Model):
    ctype = models.CharField(max_length=20)
class Company(models.Model):
    name = models.CharField(max_length=50)
    companytype = models.ForeignKey(CompanyType, on_delete=models.CASCADE)
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    company = models.ForeignKey(Company, on_delete=models.CASCADE)

我知道我可以这样做,但是有没有办法将其完全链在一行中?

def getcompanytype(request):
    user_id = request.user.id
    company_id = Profile.objects.get(user_id__exact=user_id).company_id
    companytype_id = Company.objects.get(id=company_id).companytype_id
    companytype = CompanyType.objects.get(id=companytype_id).ctype
    return(companytype)

本质上,我想要此SQL语句:

SELECT
ct.ctype
From auth_user u
left outer join Profile p
on p.user_id = u.id
left outer join Company c
on p.company_id = c.id
left outer join CompanyType ct
on ct.id = c.companytype_id
where u.id = 1 # actually current user ID, not hardcoded "1"

我认为您可以通过在 filterget呼叫中遵循外国人的反向关系来做到这一点

CompanyType.objects.get(company__profile__user__id__exact=user_id).ctype

尽管我建议您在django shell中尝试一下,并确保反向关系被命名为您的期望!(例如,CompanyType将具有一个company_set属性,该属性为所有具有特定CompanyType的公司提供;当您进行过滤器查询时,不应包括_set。(

最新更新