Skip to main content
 首页 » 编程设计

python之将一系列外键串在一起以返回 Django 中的表值

2025年02月15日24yjmyzz

如何选择了解用户的 ctype?

模型.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" 

请您参考如下方法:

我认为您可以通过在 filter 或 get 调用中遵循外键的反向关系,用双下划线连接不同的关系来做到这一点:

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

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