【问题标题】:How to create a model object with OneToOneField如何使用 OneToOneField 创建模型对象
【发布时间】:2021-09-21 03:37:04
【问题描述】:

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

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

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

Models.py - 这是我的 Message 和 Profile 模型

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>

上面的代码不起作用,我得到一个错误 Cannot assign "'admin'": "Message.author" must be a "User" instance. 所以我的问题是,怎么能我使用用户实例创建此对象并将其保存在我的数据库中,以便我可以将其与个人资料图片一起显示?

【问题讨论】:

    标签: python django web django-models chat


    【解决方案1】:

    这行有问题:

    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 来链接Message 模型和User 模型。实际上,这意味着用户只能写一条消息。

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

    【讨论】:

    • @IceSpeaker 酷!我很高兴我能帮上忙。您能否通过将此答案标记为正确来将问题标记为已回答?你可以在这里有更多的解释:meta.stackexchange.com/questions/5234/…
    猜你喜欢
    • 1970-01-01
    • 2021-12-23
    • 2021-08-03
    • 2019-02-26
    • 1970-01-01
    • 2015-10-20
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多