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)
Кроме того, я хочу исключить данные этого члена из результата, потому что они у меня уже есть.
Запрос будет не получать данные о членах, он будет получать только Conversation
s. Если вы затем запросите 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)
Тогда Conversation
s не будет содержать элемент с profile_pk
в качестве элемента Member
s.