在多对多关系中按中间模型字段过滤

时间:2019-02-06 15:14:05

标签: python django django-models

我想在组织之间建立友谊关系。我在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字段指示友谊请求是否已被请求者批准,或者该请求是否仍在等待处理。

我通过以下方法在org1org2之间建立连接:

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

2 个答案:

答案 0 :(得分:2)

我认为您使用的related_names有点误导,因为它们应该表示反向关系,所以也许将它们更改为类似的内容(不知道您的确切用例)。例如。 org.connections_requested.all()将返回包含所有连接的查询集,其中orgrequester

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)
相关问题