Python 按多对多关系中的中介模型字段筛选

Python 按多对多关系中的中介模型字段筛选,python,django,django-models,Python,Django,Django Models,我想在组织之间建立友谊关系。我在我的组织模型中添加了一个连接的组织字段: class Organisation(models.Model): ... connected_organisations = models.ManyToManyField('self', related_name='organisations_connected',

我想在组织之间建立友谊关系。我在我的
组织
模型中添加了一个
连接的组织
字段:

class Organisation(models.Model):
    ...
    connected_organisations = models.ManyToManyField('self',
                                                     related_name='organisations_connected',
                                                     through='Connection',
                                                     through_fields=('requester', 'requestee'),
                                                     symmetrical=False,
                                                     blank=True)
然后我创建了
连接
作为中介模型:

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\u organizations.all()

这将返回
org2
,但我找不到如何通过
is\u connected
字段过滤它们

我试过这样的方法:


organization.objects.filter(已连接的组织\uu请求者=org2,已连接的组织\uu是否已连接=True)

但我得到了:

django.core.exceptions.FieldError:相关字段的查找无效:是否已连接


您可以直接使用直通模型(这是我在这种情况下通常做的):


您可以直接使用直通模型(这是我在这种情况下通常做的):


我认为您使用的
相关名称有点误导,因为它们应该表示反向关系,所以可能会将它们更改为类似这样的名称(不知道您的确切用例)。例如,
org.connections\u requested.all()
将返回一个包含所有连接的查询集,其中
org
请求者

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 
您还可以直接在
连接上过滤
类:

connections = Connection.objects.filter(is_connected=True)

我认为您使用的
相关名称有点误导,因为它们应该表示反向关系,所以可能会将它们更改为类似这样的名称(不知道您的确切用例)。例如,
org.connections\u requested.all()
将返回一个包含所有连接的查询集,其中
org
请求者

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 
您还可以直接在
连接上过滤
类:

connections = Connection.objects.filter(is_connected=True)

您在
组织
模型上发布的查询似乎没有按照我预期的方式工作。我希望获得与
org1
相关的所有then组织。类似于
org1.connected\u organizations.all()
但被
过滤的是\u connected=True
连接
模型中的查询可以作为解决方案。只是问我是否可以得到同样的查询
组织
模型当你说“全部”时,你的意思是它可以是请求者或请求者?
org1
是请求者。我要查找所有作为请求者且
已连接=True
组织.objects.filter(连接已加入\u请求者=org1,连接已加入\u已连接=True)。distinct()
应返回具有由
org1
请求的连接的
organization
对象,如果您在我的回答中保留命名…您在
organization
模型上发布的查询似乎没有按我预期的方式工作。我希望获得与
org1
相关的所有then组织。类似于
org1.connected\u organizations.all()
但被
过滤的是\u connected=True
连接
模型中的查询可以作为解决方案。只是问我是否可以得到同样的查询
组织
模型当你说“全部”时,你的意思是它可以是请求者或请求者?
org1
是请求者。我要查找所有作为请求者且
已连接=True
组织.objects.filter(连接已加入\u请求者=org1,连接已加入\u已连接=True)。distinct()
应返回具有由
org1
请求的连接的
组织
对象,如果您保留我答案中的命名。。。