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()