Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django只对帖子和评论投票一次_Python_Django - Fatal编程技术网

Python 在Django只对帖子和评论投票一次

Python 在Django只对帖子和评论投票一次,python,django,Python,Django,我有两个模型叫做Post和Comment,一个用户可以对该帖子或评论进行上下投票。我想限制每个用户只能对某个帖子或评论投票一次 我可以在模型级别上做一些事情来发布和评论,而不是统计特定帖子或评论的总票数。但是,我认为创建一个单独的投票模型更具可扩展性,其中: 总票数可以通过一个查询计算,从用户id=等处的票数中选择count*。。。 每个用户投票一次,可与unique_一起强制执行 目前,我已经想出了这样的办法: import uuid from django.db import models

我有两个模型叫做Post和Comment,一个用户可以对该帖子或评论进行上下投票。我想限制每个用户只能对某个帖子或评论投票一次

我可以在模型级别上做一些事情来发布和评论,而不是统计特定帖子或评论的总票数。但是,我认为创建一个单独的投票模型更具可扩展性,其中:

总票数可以通过一个查询计算,从用户id=等处的票数中选择count*。。。 每个用户投票一次,可与unique_一起强制执行 目前,我已经想出了这样的办法:

import uuid
from django.db import models
from django.contrib.auth import get_user_model
from django.db import models

# Create your models here.


class Post(models.Model):
    LINK = "link"
    VIDEO = "video"
    IMAGE = "image"
    POST_TYPE_CHOICES = ((LINK, "Link"), (VIDEO, "Video"), (IMAGE, "Image"))

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    created = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=300)
    url = models.URLField(max_length=300)
    category = models.CharField(max_length=50)
    score = models.DecimalField(default=0, max_digits=20, decimal_places=2)
    votes = models.IntegerField(default=0)
    views = models.IntegerField(default=0)
    post_type = models.CharField(max_length=5, choices=POST_TYPE_CHOICES, default=LINK)
    text = models.CharField(max_length=40000)
    owner = models.ForeignKey('users.User', related_name='posts', on_delete=models.CASCADE)

    def __str__(self):
        return self.title

    class Meta:
        ordering = ["-created"]


class PostVote(models.Model):
    DOWNVOTE = -1
    UPVOTE = 1
    UNVOTE = 0
    VOTE_TYPE_CHOICES = ((DOWNVOTE, "Downvote"), (UPVOTE, "Upvote"), (UNVOTE, "Unvote"))

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    created = models.DateTimeField(auto_now_add=True)
    score = models.IntegerField(choices=VOTE_TYPE_CHOICES, default=UPVOTE)
    voter = models.ForeignKey('users.User', related_name='post_votes', on_delete=models.CASCADE)


class Comment(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    created = models.DateTimeField(auto_now_add=True)
    body = models.CharField(max_length=10000)
    post = models.ForeignKey('Post', related_name='comments', on_delete=models.CASCADE)
    owner = models.ForeignKey('users.User', related_name='comments', on_delete=models.CASCADE)

    class Meta:
        ordering = ["-created"]

class CommentVote(models.Model):
    DOWNVOTE = -1
    UPVOTE = 1
    UNVOTE = 0
    VOTE_TYPE_CHOICES = ((DOWNVOTE, "Downvote"), (UPVOTE, "Upvote"), (UNVOTE, "Unvote"))

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    created = models.DateTimeField(auto_now_add=True)
    score = models.IntegerField(choices=VOTE_TYPE_CHOICES, default=UPVOTE)
    voter = models.ForeignKey('users.User', related_name='comment_votes', on_delete=models.CASCADE)

    def __str__(self):
        return self.score

    class Meta:
        ordering = ["-created"]
我只知道这是一个将投票分为PostVote和CommentVote的糟糕模式,相反,我想要一个更通用的投票模式,在这个模式中,我可以指定投票是针对帖子或评论的

我不想要的是有一个投票模型,它既有post_id,也有comment_id,这使得任何一个都是空的,因为一个投票总是针对一个评论或一个帖子


有什么帮助吗?

使用泛型关系可以更好地解决这个问题。这是一篇理解概念的好文章,这里的示例与您的需求类似

使用泛型关系可以更好地解决这个问题。这是一篇理解概念的好文章,这里的示例与您的需求类似

我认为,在你的例子中,一个重要的缺失是投票不知道它属于哪个帖子或评论

类属关系 你可以有一个单一的投票模型,正如你在问题中用一个。实际上,这是一个外键,可以指向不同的模型

例如:

从django.contrib.contenttypes.fields导入GenericForeignKey 从django.contrib.contenttypes.models导入ContentType 从django.db导入模型 类Votemodels.Model: ... 你的模特儿 ... content\u type=models.ForeignKeyContentType,on\u delete=models.CASCADE 投票对象id=models.UUIDFielddefault=uuid.uuid4 投票对象=模型。GenericForeignKey“内容类型”,“投票对象id” 在您的帖子和评论中,为了能够通过查询访问投票对象的投票,一般外键的反向关系不会自动生成:

从django.db导入模型 从django.contrib.contenttypes.fields导入GenericRelation 类Postmodels。模型: ... 其他东西 ... 投票=一般关系投票,相关的_查询_name='post' 类模型。模型: ... 其他东西 ... 投票=一般关系投票,相关的\u查询\u name='comment' 通过这种方式,您可以访问投票对象,以便通过以下方式发布帖子或评论:

post=post.objects.all[0] 投票对象=投票对象。创建**投票对象数据,投票对象=发布 printvote_to_post.voted_对象 printpost.投票 我相信,但我没有机会测试,你也可以这样做:

printvote_to_post.post
我相信,在你的例子中,一个重要的缺失是投票不知道它属于哪个帖子或评论

类属关系 你可以有一个单一的投票模型,正如你在问题中用一个。实际上,这是一个外键,可以指向不同的模型

例如:

从django.contrib.contenttypes.fields导入GenericForeignKey 从django.contrib.contenttypes.models导入ContentType 从django.db导入模型 类Votemodels.Model: ... 你的模特儿 ... content\u type=models.ForeignKeyContentType,on\u delete=models.CASCADE 投票对象id=models.UUIDFielddefault=uuid.uuid4 投票对象=模型。GenericForeignKey“内容类型”,“投票对象id” 在您的帖子和评论中,为了能够通过查询访问投票对象的投票,一般外键的反向关系不会自动生成:

从django.db导入模型 从django.contrib.contenttypes.fields导入GenericRelation 类Postmodels。模型: ... 其他东西 ... 投票=一般关系投票,相关的_查询_name='post' 类模型。模型: ... 其他东西 ... 投票=一般关系投票,相关的\u查询\u name='comment' 通过这种方式,您可以访问投票对象,以便通过以下方式发布帖子或评论:

post=post.objects.all[0] 投票对象=投票对象。创建**投票对象数据,投票对象=发布 printvote_to_post.voted_对象 printpost.投票 我相信,但我没有机会测试,你也可以这样做:

printvote_to_post.post
杰出的这正是我想我需要的,谢谢!谢谢如果这解决了你的问题,把它标记为帮助他人的答案。太好了!这正是我想我需要的,谢谢!谢谢如果这解决了您的问题,请将其标记为帮助他人的答案。