簡體   English   中英

Django - 多對多關系經理

[英]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 ,這樣它只會檢索Membershipis_admin設置為TrueCompany

另一種選擇是通過以下方式檢索它:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM