python - 按多对多关系中的中间模型字段过滤
问题描述
我想在组织之间建立友谊关系。我在模型中添加了一个connected_organisations
字段Organisation
:
class Organisation(models.Model):
...
connected_organisations = models.ManyToManyField('self',
related_name='organisations_connected',
through='Connection',
through_fields=('requester', 'requestee'),
symmetrical=False,
blank=True)
然后我创建Connection
了中间模型:
class Connection(models.Model):
requester = models.ForeignKey(Organisation, related_name='requester', null=True, on_delete=models.CASCADE)
requestee = models.ForeignKey(Organisation, related_name='requestee', null=True, on_delete=models.CASCADE)
is_connected = models.BooleanField(default=False)
该is_connected
字段指示友谊请求是否被请求者批准或请求是否仍处于未决状态。
我在以下之间建立了org1
联系org2
:
Connection.objects.create(requester=org1, requestee=org2)
我知道我可以做到:
org1.connected_organisations.all()
这将返回org2
,但我找不到如何按is_connected
字段过滤它们。
我试过类似的东西:
Organisation.objects.filter(connected_organisations__requestee=org2, connected_organisations__is_connected=True)
但我得到:
django.core.exceptions.FieldError:相关字段查找无效:is_connected
解决方案
我认为related_names
您使用的有点误导,因为它们应该代表反向关系,所以也许将它们更改为这样的东西(不知道您的确切用例)。例如。org.connections_requested.all()
将返回一个包含所有连接org
的查询集,其中requester
.
class Connection(models.Model):
requester = models.ForeignKey(Organisation, related_name='connections_requested', null=True, on_delete=models.CASCADE)
requestee = models.ForeignKey(Organisation, related_name='connections_joined', null=True, on_delete=models.CASCADE)
is_connected = models.BooleanField(default=False)
您可以过滤此关系:
organisations = Organisation.objects.filter(
connections_requested__requestee=org2,
connections_requested__is_connected=True
).distinct() # you may need that
您也可以直接过滤Connection
类:
connections = Connection.objects.filter(is_connected=True)
推荐阅读
- django - 管理和静态文件夹的 Django 问题进入运行服务器响应
- python - Pandas Dataframe 列平均值的布尔运算 - 这必须很简单
- javascript - 使用 stringify 将 javascript 对象转换为 JSON
- python - 文本分类到预定义的类别
- c++ - 如何将 \x00 视为带有 00(双零)的简单六进制字符串?
- forms - 实体(带约束)+ createFormBuilder(带额外字段)失败
- c - 如何获取另一个程序的输出作为我的程序的管道?
- r - 如何根据字符串值分配 geom_point 颜色
- ionic-framework - 如何在 ionic 5 中打开模式?
- sql - 带有子查询的 redshift sql 查询中的语法错误