Django ORM:排除多对多关系中的特定记录
Django ORM: Excluding Specific Record in Many-to-Many Relationship
我在两个模型 Profile 和 Conversation 之间建立了多对多关系,如下所示:
class Profile(models.Model):
# ...
class Conversation(models.Model):
members = models.ManyToManyField(Profile, related_name="conversations")
现在我想 select 特定配置文件是其中成员的所有对话,我尝试了这个方法,但我不确定它是否正确:
conversations = Conversation.objects.filter(members='<profile_pk>')
另外,我想从结果中排除那个成员的数据,因为我已经有了它,或者我应该在客户端排除他的数据吗?
是的,这个方法是对的,可以过滤:
conversations = Conversation.objects.filter(members=<em>profile_pk</em>) # or
conversations = Conversation.objects.filter(members=<em>profile_object</em>) # or
conversations = Conversation.objects.filter(members__id=<em>profile_pk</em>)
Also, I want to exclude that member's data from the result because I already have it.
查询将不会获取会员数据,它只会获取Conversation
s。如果您随后查询 myconversation.members.all()
,您将获得所有成员数据,包括 Profile
.
之一
如果您想在获取此内容时从成员中排除 Profile
,您可以使用 Prefetch
对象:
from django.db.models import <strong>Prefetch</strong>
conversations = Conversation.objects.prefetch_related(
<strong>Prefetch(</strong>'members', Profile.objects.exclude(pk=<em>profile_pk</em>)<strong>)</strong>
).filter(members=<em>profile_pk</em>)
Conversation
将不包含 profile_pk
作为 Member
的项目。
我在两个模型 Profile 和 Conversation 之间建立了多对多关系,如下所示:
class Profile(models.Model):
# ...
class Conversation(models.Model):
members = models.ManyToManyField(Profile, related_name="conversations")
现在我想 select 特定配置文件是其中成员的所有对话,我尝试了这个方法,但我不确定它是否正确:
conversations = Conversation.objects.filter(members='<profile_pk>')
另外,我想从结果中排除那个成员的数据,因为我已经有了它,或者我应该在客户端排除他的数据吗?
是的,这个方法是对的,可以过滤:
conversations = Conversation.objects.filter(members=<em>profile_pk</em>) # or
conversations = Conversation.objects.filter(members=<em>profile_object</em>) # or
conversations = Conversation.objects.filter(members__id=<em>profile_pk</em>)
Also, I want to exclude that member's data from the result because I already have it.
查询将不会获取会员数据,它只会获取Conversation
s。如果您随后查询 myconversation.members.all()
,您将获得所有成员数据,包括 Profile
.
如果您想在获取此内容时从成员中排除 Profile
,您可以使用 Prefetch
对象:
from django.db.models import <strong>Prefetch</strong>
conversations = Conversation.objects.prefetch_related(
<strong>Prefetch(</strong>'members', Profile.objects.exclude(pk=<em>profile_pk</em>)<strong>)</strong>
).filter(members=<em>profile_pk</em>)
Conversation
将不包含 profile_pk
作为 Member
的项目。