Категории бесед Django для сообщений с помощью ManyToMany
Я создаю своего рода социальную сеть на Django. Это объясняет в основном то, что я делаю:
Django - представление беседы в личных сообщениях
Разговоры ведутся исключительно между двумя людьми, не более. У меня есть модель беседы, потому что когда они переходят к своим сообщениям, я хочу, чтобы у пользователя был список других пользователей, с которыми у него есть сообщения.
Вот соответствующее представление:
def writemessage(request, id):
profile = Profile.objects.get(id=id)
context = {
'profile': profile,
}
if request.method == 'POST':
sender = request.user
receiver = profile.user
content = request.POST['content']
timestamp = datetime.now()
print(sender, receiver, content, timestamp)
record = Message(sender=sender, receiver=receiver, content=content, timestamp=timestamp)
record.save()
senderprofile = Profile.objects.get(user=sender)
receiverprofile = Profile.objects.get(user=receiver)
record.conversation.add(senderprofile)
record.conversation.add(receiverprofile)
print(senderprofile, receiverprofile)
return redirect('messagespage')
return render(request, 'thecode/writemessage.html', context)
Вот мои модели:
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
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 self.participants
class Message(models.Model):
sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name='sender')
receiver = models.ForeignKey(User, on_delete=models.CASCADE, related_name='receiver')
content = models.TextField()
conversation = models.ForeignKey(Conversation, default=None, on_delete=models.CASCADE, null=True)
timestamp = models.DateTimeField()
def __str__(self):
return self.sender.username + ' to ' + self.receiver.username
Я знаю о некоторой документации:
https://docs.djangoproject.com/en/dev/ref/models/relations/
Я пытался понять документацию, а также сообщения здесь, но немного застрял.
у объекта 'NoneType' нет атрибута 'add' = сообщения об ошибках, которые я получаю
Поле Message объекта conversation по умолчанию None, и ваша функция представления не устанавливает conversation перед попыткой прочитать его. Вам нужно выяснить, к какому Conversation относится это сообщение, а затем установить его при построении Message:
record = Message(conversation=???, sender=sender, receiver=receiver, content=content, timestamp=timestamp)
record.save()
Как узнать, в каком разговоре находится User?
Несколько замечаний по обзору кода:
- Аргументы
related_nameдля ваших полейForeignKeyуказывают на имя поля в моделиUser, которое ссылается назад на модельMessage, а не наоборот. Поэтому вместоsenderиreceiver, они должны бытьmessages_sentиmessages_received. Пожалуйста, обновите ваше первоначальное сообщение, чтобы улучшить ясность.# Example of accessing sent and received messages from a User model: user.messages_sent user.messages_received