Django 1.6对于多模型的投票模型,有没有更好的设计?

时间:2014-03-02 12:09:05

标签: django

查询欲望:

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)

0 个答案:

没有答案