Django:更改从QuerySet返回的模型类?

时间:2013-11-22 06:29:53

标签: django django-models

我正在构建一个分析仪表板,我想为我要查询的一些对象添加一些特定于仪表板的方法。例如,如果我有一个Book模型:

class Book(m.Model):
    title = m.CharField()
    author = m.ForeignKey(User)

我可能希望有一个DashboardBook课程,可以总结查看该书的用户:

class DashboardBook(Book):
    @classmethod
    def query(cls):
        return cls.objects.extra(select={"_raw_recent_views": "SELECT ARRAY(…)"})

    @property
    def recent_views(self):
        return DashboardBookViews(self._raw_recent_views)

有什么方法可以明智地做到这一点吗?

我试过这个:

class DashboardBook(Book):
    class Meta:
        managed = False
        abstract = True
        db_table = 'books_book'

    @classmethod
    def query(cls):
        query = cls.objects.all().select_related('user')
        query.model = cls
        return query

但是有些非常令人惊讶的事情发生了,就像书的title字段被用户的哈希密码所取代一样。

请注意:我正在寻找具体,了解如何使用QuerySet完成此操作,因为如果我可以通过QuerySet这将非常方便{1}}周围(例如,Paginator)。我知道有很多方法可以包裹QuerySet(例如,[DashboardBook(b) for b in Book.objects.all()]),但这很快就会变成黑客。

1 个答案:

答案 0 :(得分:1)

您需要代理模型:https://docs.djangoproject.com/en/1.6/topics/db/models/#proxy-models

此外,模型特定查询最好使用自定义ModelManager而不是使用classmethod实现。