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
请求的连接的组织
对象,如果您保留我答案中的命名。。。