python - Django - ManyToMany 关系的管理器

标签 python django many-to-many

我有 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/

相关文章:

python - 使用 Python 和 Beautiful Soup 进行网页抓取

Python - 使用 pandas hub_table 对特定值进行求和和计数

python - 跳过行,csv.DictReader

python - SyntaxError : invalid syntax on lib/python3. 8/site-packages/sql_server/pyodbc/base.py django 在 Linux 上部署

python - django-rest-framework "AttributeError: ' 函数'对象没有属性 'get_extra_actions' ”

javascript - Django,html 标签未解释

java - 当访问模式依赖于一对多时,如何处理 POJO 中多对多表中的附加属性?

python - 你能在Python中写入文件的中间吗?

mysql - 错误号 :150 in MySQL Database

java - JPA 和 Hibernate 持久化 @manytoOne 关系