【问题标题】:Storing a list of data in a list django在列表 django 中存储数据列表
【发布时间】:2020-02-29 22:38:07
【问题描述】:

我正在创建一个用户支持的支持系统,但是为了防止用户多次投票,我需要存储所有支持该帖子的用户的列表,我正在使用 sqlite3 数据库,我想知道如何将这些用户存储在我的帖子模型中的列表中,我尝试了几种不同的选项,但它们没有奏效。

数据库:sqlite3 Python版本:3.8 Django 版本:3.0.3

当前尝试:

models.py:

class Upvote(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)

当前代码:

def up_vote(request, pk):
    current_user=request.user
    pk=Post.objects.get(pk)


    try:
        post_instance = Post.objects.get(pk) 
        upvote = Upvote(post=post_instance, user=current_user)
    except Upvote.DoesNotExist:
        post_instance = Post.objects.get(pk)
        upvote = Upvote(post=post_instance, user=current_user)
    return redirect(Post(pk))

【问题讨论】:

    标签: python django sqlite


    【解决方案1】:

    您需要有一个 Upvote 模型和 Post 模型的外键。以此为例:

    class Upvote(models.Model):
        user = models.ForeignKey(User, on_delete=models.CASCADE)
        post = models.ForeignKey(Post, on_delete=models.CASCADE)
    

    一旦用户对帖子投了赞成票,您就可以在 Upvote 表中创建一行。您可以使用 try 块检查用户是否已经对帖子进行了投票:

    try:
        upvote = Upvote.objects.get(post=some_post, user=some_user)
        # User has upvoted
        # Response accordingly
    except Upvote.DoesNotExist:
        upvote = Upvote(post=some_post, user=some_user)
        # Create the upvote
    

    编辑
    关于您的错误,当您使用外键创建或查询模型的新实例时,您应该传递外键的实例,而不是类本身。你现在是:

    upvote = Upvote(post=Post, user=current_user)
    # Notice the Post
    

    Post 是类Post 的定义。您应该做的是创建/获取类Post 的实例并将其传递。如:

    post_instance = Post.objects.get(pk=2) # Or whatever query you might need to use or even creating a new post
    upvote = Upvote(post=post_instance, user=current_user)
    

    【讨论】:

    • 如何为 Post 模型创建外键。我知道这可能很简单,但我是 Django 框架的新手
    • 如果帖子位于其他位置,可能在另一个应用程序中,您可以使用字符串给出路径,例如,models.ForeignKey('myOtherApp.Post', on_delete=models.CASCADE)
    • 好的,我刚刚尝试了您的解决方案,但出现错误,我将立即更新我的帖子
    • 感谢更新我刚刚尝试过,现在出现类型错误:不可迭代的 int 对象
    • @LukeAcko13 请用日志或代码更新您的问题
    【解决方案2】:

    对于这种类型的数据,通常最好创建一个新模型,例如,称为“Upvotes”,它将有 3 个字段:

    class Upvotes(models.Model):
        user = models.ForeignKey(User, on_delete=models.CASCADE)
        post = models.ForeignKey(Post, on_delete=models.CASCADE)
        timestamp = models.DateTimeField(auto_now_add=True)
    

    这样您将创建一个表格,其中将包含所有已点赞评论的用户以及他们点赞的评论,包括日期和时间。

    希望对你有帮助。

    【讨论】:

    • 谢谢,没想到。我现在就试试
    猜你喜欢
    • 1970-01-01
    • 2012-04-21
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    相关资源
    最近更新 更多