Django проверяет, существуют ли отношения "многие-ко-многим

У меня есть своего рода социальная сеть в Django, где люди могут отправлять прямые сообщения. Внутри всех этих сообщений у меня есть поле беседы, показывающее, между кем эти сообщения, чтобы я мог группировать сообщения по людям, когда показываю их пользователю.

Я пытаюсь понять, как я могу искать, существует ли разговор. В приведенных ниже операторах печати в представлении я получаю ответ:

<QuerySet [<Conversation: Sarah and Stephen>, <Conversation: Sarah and James>]>

<QuerySet [<User: Sarah>, <User: Stephen>]>

<QuerySet [<User: Sarah>, <User: James>]>

В приведенном ниже представлении отправитель - 'Sarah', а получатель - 'James', поэтому я пытаюсь понять, как я могу искать, существует ли уже разговор между ними (через фильтр или что-то в этом роде), сопоставляя их с видами списков QuerySet выше, чтобы, если да, я мог использовать этот разговор, а если нет, я могу создать разговор. Я перепробовал много способов, но все время застреваю. Я довольно новичок в отношениях "многие-ко-многим".

Вид

def writemessage(request, id):
    profile = Profile.objects.get(id=id)
    context = {
        'profile': profile,
    }
    conversations = Conversation.objects.all()
    print(conversations)
    for each in conversations:
        print(each.participants.all())
    if request.method == 'POST':
        sender = request.user
        receiver = profile.user
        content = request.POST['content']
        timestamp = datetime.now()
        record = Message(sender=sender, receiver=receiver, content=content, timestamp=timestamp)
        record.save()
        senderprofile = Profile.objects.get(user=sender)
        receiverprofile = Profile.objects.get(user=receiver)
        # below is where the code breaks
        record.conversation.add(senderprofile)
        record.conversation.add(receiverprofile)
        return redirect('messagespage')
    return render(request, 'thecode/writemessage.html', context)

Мои модели

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    city = models.CharField(max_length=60)
    country = models.CharField(max_length=60)
    skillstolearn = models.CharField(max_length=200)
    skillstoteach = models.CharField(max_length=200)
    description = models.TextField()

    def __str__(self):
        return self.user.username

class Conversation(models.Model):
    participants = models.ManyToManyField(User)
    
    def __str__(self):
        return str(self.participants.all()[0]) + ' and ' + str(self.participants.all()[1])

Для поиска Разговора, в котором M2M содержит только этих 2 пользователей, вы можете использовать chain filters() и использовать exists() для проверки, существует ли этот Разговор между этими 2 пользователями:

sarah_user = User.objects.get(username="Sarah")
stephen_user = User.objects.get(username="Stephen")
Conversation.objects.filter(participants=sarah_user).filter(participants=stephen_user).exists()
Вернуться на верх