Django ORM: Исключение конкретной записи в отношениях "многие-ко-многим

У меня есть отношение "многие ко многим" между двумя моделями Profile и Conversation следующим образом:

class Profile(models.Model):
    # ...

class Conversation(models.Model):
    members = models.ManyToManyField(Profile, related_name="conversations")

Теперь я хочу выбрать все разговоры, в которых участвует определенный профиль, я попробовал это, но не уверен, что это правильный способ:

conversations = Conversation.objects.filter(members='<profile_pk>')

Кроме того, я хочу исключить данные этого члена из результата, потому что они у меня уже есть, или я должен исключить его данные на стороне клиента?

Да, это правильный способ, вы можете фильтровать с помощью:

conversations = Conversation.objects.filter(members=profile_pk)  # or
conversations = Conversation.objects.filter(members=profile_object)  # or
conversations = Conversation.objects.filter(members__id=profile_pk)

Кроме того, я хочу исключить данные этого члена из результата, потому что они у меня уже есть.

Запрос будет не получать данные о членах, он будет получать только Conversations. Если вы затем запросите myconversation.members.all(), вы получите все данные члена, включая данные члена Profile.

Если вы хотите исключить этот Profile из членов при получении этого, вы можете работать с объектом Prefetch:

from django.db.models import Prefetch

conversations = Conversation.objects.prefetch_related(
    Prefetch('members', Profile.objects.exclude(pk=profile_pk))
).filter(members=profile_pk)

Тогда Conversations не будет содержать элемент с profile_pk в качестве элемента Members.

Вернуться на верх