我有 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)?
最佳答案
您可以创建如下所示的管理器:
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()
现在您可以轻松调用以下内容(例如在您的 View 中):
my_person.administered_companies.all()
PS:一个非常有效的选项(例如,如果您在 View 中并且需要给定人员的公司 ID 列表)是直接查询成员资格模型,因此您可以优化从数据库检索数据的查询,避免连接:
Membership.objects.filter(is_admin=True, person=person).values_list('company_id')
关于python - Django - ManyToMany 关系的管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70041331/