多多关系中的中介模型字段过滤

2024-09-28 17:23:22 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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: Related Field got invalid lookup: is_connected


Tags: name模型trueismodelsrequesterconnectionclass
2条回答

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

qs = Connection.objects.filter(requester=org1, requestee=org2, is_connected=True)

我认为您使用的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)

相关问题 更多 >