【发布时间】:2012-02-04 06:58:35
【问题描述】:
我正在使用类似于 T. Stone 在this question 上的回答的方法。但是,我添加了一个抽象基类,所以我的 models.py 看起来像这样:
class CustomQuerySetManager(models.Manager):
"""A re-usable Manager to access a custom QuerySet"""
def __getattr__(self, attr, *args):
try:
return getattr(self.__class__, attr, *args)
except AttributeError:
return getattr(self.get_query_set(), attr, *args)
def get_query_set(self):
return self.model.QuerySet(self.model)
class MyModel(models.Model):
class Meta:
abstract = True
class QuerySet(QuerySet):
def user(self, pub, *args, **kwargs):
return self.filter(publisher=pub, *args, **kwargs)
...some more methods here
class Book(MyModel):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author, related_name='book_author')
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
objects=models.Manager()
obj=CustomQuerySetManager() #for testing purposes only, this will override objects later
这使我可以获取给定出版商的所有书籍,如下所示:
p = Publisher.object.get(pk=1)
Book.obj.user(p).all()
我想扩展它,以便我可以在 Book 模型中定义自定义查询,然后将 Q 对象传递给 QuerySet 类,因此查询“publisher=pub”对于不同的模型可能会有所不同。我仍然希望能够像 Book.obj.user(p).all() 一样调用它。我需要在 Book 模型中的某个地方:
pubQ=Q(publisher=pub)
我可以把它放在哪里以及如何将它传递给抽象基类中定义的 QuerySet,同时尽可能保持代码 DRY?
【问题讨论】:
标签: python django django-models