[英]Django queryset of related objects
具有以下模型:
class Company(models.Model):
name = models.CharField(max_length=10)
class Department(models.Model):
name = models.CharField(max_length=10)
company = models.ForeignKeyField(to=Company)
persons = models.ManyToManyField(to=Person, on_delete=models.PROTECT)
class Person(models.Model):
name = models.CharField(max_length=10)
我想獲得一個queryset
所有的人在公司
使用
def persons_by_company(company_name):
l = []
for d in Department.objects.filter(company__name=company_name):
for p in d.persons:
l.append(p)
return l
將是
在這里獲取查詢集的方法是什么?
就我而言,我認為這很簡單,只需
Person.objects.filter(departement__company__id=company_id).distinct()
或使用公司名稱:
Person.objects.filter(departement__company__name__iexact=company_name).distinct()
你的功能會變成:
def persons_by_company(company_name):
return Person.objects.filter(departement__company__name__iexact=company_name).distinct()
它返回一個QuerySet,它的速度更快。 我使用iexact
來避免區分大小寫。
更新: .distinct()
只是為了刪除重復的條目。
首先你必須有外鍵綁定到你的公司或部門
class Department(models.Model):
name = models.CharField(max_length=10)
company = models.ForeignKeyField(to=Company, related_name="department_company_key")
class Person(models.Model):
name = models.CharField(max_length=10)
person_department = models.ForeignKey(
'Department',
related_name="person_department_key"
on_delete=models.CASCADE,
blank=False,
null=False
)
然后在你的函數中:
def persons_by_company(company_name):
l = []
for d in Department.objects.filter(company__name=company_name):
for p in d.person_department_key.all(): # You also apply some filter()
l.append(p) # Remember This will append object not string or dictionary
return l
不要忘記相關名稱必須是唯一的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.