我正在构建一个分析仪表板,我想为我要查询的一些对象添加一些特定于仪表板的方法。例如,如果我有一个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()]
),但这很快就会变成黑客。
答案 0 :(得分:1)
您需要代理模型:https://docs.djangoproject.com/en/1.6/topics/db/models/#proxy-models
此外,模型特定查询最好使用自定义ModelManager而不是使用classmethod实现。