我想在组织之间建立友谊关系。我在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
答案 0 :(得分:2)
我认为您使用的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)
答案 1 :(得分:1)
您可以直接使用直通模型(在这种情况下,我通常会这样做):
qs = Connection.objects.filter(requester=org1, requestee=org2, is_connected=True)