简体   繁体   English

Django - 多对多关系经理

[英]Django - manager on ManyToMany relationship

I have 3 models我有 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()

I can then call person.companies.all() to get the list of companies associated with person.然后我可以调用person.companies.all()来获取与 person 相关的公司列表。

How do I create a manager to have the list of companies associated with person, but whose person is admin (is_admin = True)?如何创建经理以将公司列表与人员关联,但其人员是管理员(is_admin = True)?

You can filter with:您可以使用以下方式过滤:

person.companies.filter(membership__is_admin=True)

This will filter the junction table Membership , such that it will only retrieve Company s for which the Membership has is_admin set to True .这将过滤联结表Membership ,这样它只会检索Membershipis_admin设置为TrueCompany

Another option is to retrieve this with:另一种选择是通过以下方式检索它:

Company.objects.filter(membership__is_admin=True, members=person)

You can attach this to the Person model with:您可以将其附加到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)

You can create a manager like the following:您可以创建如下管理器:

managers.py : 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)

and then in your Person model:然后在你的Person model 中:

class Person(models.Model):
    name = models.CharField(max_length=128)
    objects = models.Manager()
    administrated_companies = AdminCompaniesManager()

Please mind the objects manager.请注意objects管理器。

Now you can easily call the following in your views:现在您可以在视图中轻松调用以下内容:

my_person.administrated_companies.all()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM