如何使用 OneToOneField 创建模型对象

How to create a model object with OneToOneField

我有一个聊天应用程序,我正在尝试保存一条消息。我的消息模型有一个 OneToOneField,我这样做是因为我想在模板中显示带有消息的个人资料图像。 这是我的代码.....

Consumers.py - 这里是消息应该保存的地方

@sync_to_async
def save_message(self, username, room, message):
    Message.objects.create(author = username, room = room, content = message)

Models.py - 这是我的消息和个人资料模型

class Message(models.Model):
    author = models.OneToOneField(User, on_delete=models.CASCADE)
    room = models.CharField(max_length = 255)
    content = models.TextField()
    date_added = models.DateTimeField(auto_now_add = True)

    class Meta:
        ordering = ('date_added', )

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default='default.png', upload_to='profile_pics')

    def __str__(self):
        return f'{self.user.username} Profile'

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)

        img = Image.open(self.image.path)

        if img.height > 300 or img.width > 300:
            output_size = (300, 300)
            img.thumbnail(output_size)
            img.save(self.image.path)

这里是我的模板的一部分,我想在其中显示消息

    <main>
    <div id="chat-text">
        <div id=message> 
            {% for m in messages %}
                <img id="imageid" src="{{ m.author.profile.image.url }}"> <b id="b2" style="color: rgb(252, 93, 93);"> {{m.author}}</b> <br>
                </b> {{ m.content }} <br> 
            {% endfor %} 
        </div> 
    </div>
    <div id="message-box">
        <div class="input-container">
            <input id="file-send" type="button">
            <input id="input" placeholder="Type a message here..." type="text">
            <input id="submit" type="submit" value="">
        </div>
    </div>
</main>

上面的代码不起作用,我得到一个错误无法分配“'admin'”:“Message.author”必须是“用户”实例。 所以我的问题是,如何使用用户实例创建此对象并将其保存在我的数据库中以便我可以将其与个人资料图片一起显示?

这行有问题:

Message.objects.create(author = username, room = room, content = message)

确实,author 应该是一个 User 对象,我猜 username 是一个 String

你应该先得到你的用户对象,像这样:

user = User.objects.get(username = username)
Message.objects.create(author = user, room = room, content = message)

此外,您可能不想使用OneToOneField到linkMessage模型和User 模型。事实上,这意味着一个用户只能写一条消息。

请改用 ForeignKey,这不会更改模板中的任何内容。