我有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()來獲取與個人關聯的公司串列。
如何創建經理以擁有與人員關聯的公司串列,但其人員是管理員(is_admin = True)?
uj5u.com熱心網友回復:
您可以創建如下管理器:
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模型中(請提醒objects經理):
class Person(models.Model):
name = models.CharField(max_length=128)
objects = models.Manager()
administered_companies = AdminCompaniesManager()
現在您可以輕松呼叫以下內容(例如在您的視圖中):
my_person.administered_companies.all()
PS:一個非常有效的選擇(例如,如果您在視圖中并且需要給定人員的公司 ID 串列)是直接查詢成員資格模型,這樣您就可以優化從資料庫檢索資料的查詢,避免連接:
Membership.objects.filter(is_admin=True, person=person).values_list('company_id')
uj5u.com熱心網友回復:
您可以過濾:
person.companies.filter(membership__is_admin=True)
這將過濾連接表Membership,以便它只檢索已設定為 的Companys 。Membershipis_adminTrue
另一種選擇是使用以下方法檢索它:
Company.objects.filter(membership__is_admin=True, members=person)
您可以使用以下命令將其附加到Person模型:
class Person(models.Model):
name = models.CharField(max_length=128)
@property
def admin_companies(self):
return self.companies.filter(membership__is_admin=True)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/361109.html
