Django ORM select 存在外键的不同模型列表
Django ORM select distinct list of models where a foreign key exists
在我的 Django 项目中,我有两个模型通过外键关系相互连接:
Invite (has one Event) to Event (has many invites)
我能够 select 我关心的相关邀请列表如下:
invites = Invite.objects.filter(guest = guest)
我可以访问每个邀请的每个事件,但这可能会导致重复。从上面,我想得到一个唯一的事件列表。
型号如下:
models.py
class Invite(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
event = models.ForeignKey(Event, on_delete=models.CASCADE)
guest = models.ForeignKey(Guest, on_delete=models.CASCADE)
rsvp_attendance = models.BooleanField(blank=True, null=True)
class Event(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=100)
实现此目标的最佳方法是什么?
您可以使用 Exists
表达式,如下所示:
Event.objects.filter(Exists(Invite.objects.filter(event=OuterRef('pk'))))
这将为您提供所有活动,这些活动经过过滤,因此至少有一个邀请必须引用一个活动。
OuterRef
是子查询的一部分,引用您实际要匹配的对象。 documentation
中提供了有关子查询和存在的更多详细信息
试试:
Events.objects.filter(invite__guest = guest)
这会选择一个活动列表,其中包含对给定客人的邀请
在我的 Django 项目中,我有两个模型通过外键关系相互连接:
Invite (has one Event) to Event (has many invites)
我能够 select 我关心的相关邀请列表如下:
invites = Invite.objects.filter(guest = guest)
我可以访问每个邀请的每个事件,但这可能会导致重复。从上面,我想得到一个唯一的事件列表。
型号如下:
models.py
class Invite(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
event = models.ForeignKey(Event, on_delete=models.CASCADE)
guest = models.ForeignKey(Guest, on_delete=models.CASCADE)
rsvp_attendance = models.BooleanField(blank=True, null=True)
class Event(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=100)
实现此目标的最佳方法是什么?
您可以使用 Exists
表达式,如下所示:
Event.objects.filter(Exists(Invite.objects.filter(event=OuterRef('pk'))))
这将为您提供所有活动,这些活动经过过滤,因此至少有一个邀请必须引用一个活动。
OuterRef
是子查询的一部分,引用您实际要匹配的对象。 documentation
试试:
Events.objects.filter(invite__guest = guest)
这会选择一个活动列表,其中包含对给定客人的邀请