Django ManyToMany关系如何自定义Manager筛选用户为管理员的关联公司
实现方法
有两种常见的实现方式,你可以根据使用习惯选择:
方案1:扩展原有companies关联管理器(推荐)
在不改动原有person.companies.all()用法的前提下,给关联管理器新增admin()方法直接查询管理员身份的关联公司。
- 首先定义自定义关联管理器:
from django.db import models class CompanyRelatedManager(models.Manager): def admin(self): # 通过中间表过滤is_admin=True的关联记录 return self.filter(membership__is_admin=True)
- 修改
Company模型的多对多字段,指定自定义的反向关联管理器:
class Company(models.Model): name = models.CharField(max_length=128) members = models.ManyToManyField( Person, through='Membership', related_name='companies', # 新增参数指定自定义关联管理器类 related_manager_cls=CompanyRelatedManager )
使用方式:
# 获取所有关联公司,原有逻辑不变 all_companies = person.companies.all() # 仅获取作为管理员的关联公司 admin_companies = person.companies.admin()
方案2:新增独立的管理员公司查询入口
直接在Person模型中封装专属查询逻辑,调用更直观:
class Person(models.Model): name = models.CharField(max_length=128) @property def admin_companies(self): return self.companies.filter(membership__is_admin=True)
使用方式:
admin_companies = person.admin_companies.all()
注意说明
过滤条件中的membership是中间表Membership的默认反向关联名,如果你在中间表的外键字段上自定义了related_name,需要替换为你自定义的名称。
内容的提问来源于stack exchange,提问作者davideghz
相关产品推荐
相关产品推荐

