python - 使用 Django ManyToMany 对称属性构建传递依赖
问题描述
是否可以使用该symmetrical
属性,models.ManyToManyField
以便我可以在记录之间创建传递依赖关系?
例如,在我的代码中,我有:
class User(models.Model):
website = models.ForeignKey('myapp.Website')
related_users = models.ManyToManyField('self', related_name='users', symmetrical=True)
当我做:
user_a.related_users.add(user_b)
user_a.related_users.all() # returns the user B
user_b.related_users.all() # returns the user A
这里一切都按预期工作,关系是对称的。
但是当我这样做时:
user_b.related_users.add(user_c)
user_b.related_users.all() # returns user A and user C
user_c.related_users.all() # returns user B
我希望用户 C 自动返回用户 A 和用户 B,因为用户 C 是用户 B,即用户 A,因此用户 C 也是用户 A。
是否有可能实现这一点,还是我必须手动添加用户 A 和用户 C 之间的关联?
解决方案
一个简单的解决方案是编写一个自定义管理器,如果您只想深入一层,以下内容可能会奏效
class UserManager(models.Manager):
def two_level_related(self):
all_related = self.related_users.all()
for related_user in self.related_users.all():
all_related.union(related_user.related_users.all())
return all_related
推荐阅读
- android - 选择存在与计数
- docker - 错误!Fabric Docker镜像版本1.1.0与测试网支持的版本不匹配
- workflow - WildcardError - 没有为通配符提供值 - Snakemake
- vba - 只需拨入未在 vba 中打开的 url 获取请求
- python - ValueError:无法强制转换为 Series,长度必须为 1:给定 506
- blazor-server-side - ASP.NET Core Blazor 中的多个窗口
- python - 运行以下代码时出现错误('DataFrame' 对象没有属性'as_matrix')
- django - 当我通过我的 api 发送数据时,我在 /api/add/ 处收到此错误 TypeError UserInfo 类型的对象不是 JSON 可序列化的
- javascript - Javascript范围不更新全局变量
- javascript - EventListener 仅在浏览器窗口处于非活动状态(不在顶部)时工作