Python 在Django只对帖子和评论投票一次
我有两个模型叫做Post和Comment,一个用户可以对该帖子或评论进行上下投票。我想限制每个用户只能对某个帖子或评论投票一次 我可以在模型级别上做一些事情来发布和评论,而不是统计特定帖子或评论的总票数。但是,我认为创建一个单独的投票模型更具可扩展性,其中: 总票数可以通过一个查询计算,从用户id=等处的票数中选择count*。。。 每个用户投票一次,可与unique_一起强制执行 目前,我已经想出了这样的办法:Python 在Django只对帖子和评论投票一次,python,django,Python,Django,我有两个模型叫做Post和Comment,一个用户可以对该帖子或评论进行上下投票。我想限制每个用户只能对某个帖子或评论投票一次 我可以在模型级别上做一些事情来发布和评论,而不是统计特定帖子或评论的总票数。但是,我认为创建一个单独的投票模型更具可扩展性,其中: 总票数可以通过一个查询计算,从用户id=等处的票数中选择count*。。。 每个用户投票一次,可与unique_一起强制执行 目前,我已经想出了这样的办法: import uuid from django.db import models
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
杰出的这正是我想我需要的,谢谢!谢谢如果这解决了你的问题,把它标记为帮助他人的答案。太好了!这正是我想我需要的,谢谢!谢谢如果这解决了您的问题,请将其标记为帮助他人的答案。