[英]Django - manager on ManyToMany relationship
我有 3 個模型
class Person(models.Model):
name = models.CharField(max_length=128)
class Company(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField (Person, through = 'Membership', related_name = 'companies')
class Membership(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
company = models.ForeignKey(Company, on_delete=models.CASCADE)
is_admin = models.BooleanField()
然后我可以調用person.companies.all()
來獲取與 person 相關的公司列表。
如何創建經理以將公司列表與人員關聯,但其人員是管理員(is_admin = True)?
您可以使用以下方式過濾:
person.companies.filter(membership__is_admin=True)
這將過濾聯結表Membership
,這樣它只會檢索Membership
的is_admin
設置為True
的Company
。
另一種選擇是通過以下方式檢索它:
Company.objects.filter(membership__is_admin=True, members=person)
您可以將其附加到Person
model :
class Person(models.Model):
name = models.CharField(max_length=128)
@property
def admin_companies(self):
return self.companies.filter(membership__is_admin=True)
您可以創建如下管理器:
managers.py
:
from django.db import models
class AdminCompaniesManager(models.Manager):
def get_queryset(self):
return super().get_queryset().companies.filter(membership__is_admin=True)
然后在你的Person
model 中:
class Person(models.Model):
name = models.CharField(max_length=128)
objects = models.Manager()
administrated_companies = AdminCompaniesManager()
請注意objects
管理器。
現在您可以在視圖中輕松調用以下內容:
my_person.administrated_companies.all()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.