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.

查询将不会获取会员数据,它只会获取Conversations。如果您随后查询 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 的项目。