查询欲望:
1.按其属性score
排序4个模型(将来可能更多)。据说这很慢:
#`Item` represent Question, Answer, Topic or Reply.
sorted(Item.objects.all(),key=lambda i:i.score)
2.列出用户或项目的投票历史记录。显然,这可以通过模型Vote
自然解决。但如果设计中没有这样的模型,那么这种愿望应该以其他方式实现。
我目前的解决方案是为四个模型添加一个整数字段rate
,因此每次投票操作发生时,除了模型Vote
中添加的记录外,其rate
字段可以使用其属性score
中的值保存。但是有更好的设计吗?感谢。
这是相关模型:
#models.py
class BaseAction(models.Model):
class Meta:
abstract = True
user = models.ForeignKey(User)
create_time = models.DateTimeField(auto_now_add=True)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey("content_type", "object_id")
class Vote(BaseAction):
value = models.IntegerField(default=0) #all possible value is -1,0 and 1
class BaseItem(models.Model):
class Meta:
abstract = True
user = models.ForeignKey(User)
content = models.TextField()
vote = generic.GenericRelation(Vote)
@property
def score(self):
'''
this is the key method to sort a model.
'''
return sum([a.value for a in self.vote.all()])
#---there are 4 models that can be voted, maybe more in the future.------
class Question(BaseItem):
title = models.CharField(max_length=50)
class Answer(BaseItem):
question = models.ForeignKey(Question)
class Topic(BaseItem):
title = models.CharField(max_length=50)
class Reply(BaseItem):
topic = models.ForeignKey(Topic)