Категории бесед 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
    
Вернуться на верх