Python 抽象Django模型管理器
我在这里缺乏Python元编程知识。假设我有以下几点:Python 抽象Django模型管理器,python,django,django-models,metaprogramming,Python,Django,Django Models,Metaprogramming,我在这里缺乏Python元编程知识。假设我有以下几点: class OwnCompanyManager(models.Manager): """Only companies of this user""" def get_queryset(self, user): if user.is_superuser: return super(OwnCompanyManager, self).get_queryset() return
class OwnCompanyManager(models.Manager):
"""Only companies of this user"""
def get_queryset(self, user):
if user.is_superuser:
return super(OwnCompanyManager, self).get_queryset()
return super(OwnCompanyManager, self).get_queryset().filter(
companyuser__user=user)
class OwnPublisherManager(models.Manager):
"""Only publishers of this user's company"""
def get_queryset(self, user):
if user.is_superuser:
return super(OwnPublisherManager, self).get_queryset()
return super(OwnPublisherManager, self).get_queryset().filter(
company__companyuser__user=user)
class Company(models.Model):
name = models.CharField(max_length=45)
objects = models.Manager()
own = OwnCompanyManager()
class Publisher(models.Model):
company = models.ForeignKey(Company)
allow_latest_dev = models.BooleanField(default=False)
domains_blocked = models.BooleanField(default=False)
objects = models.Manager()
own = OwnPublisherManager()
我还有很多。我不喜欢复制粘贴样板Own(Publisher | Company | Etcetra)Manager)
。正如您所看到的,唯一的变化是在过滤器中
我如何从
公司
、出版商
和其他模型中提取自己的(InsertModelName here)Manager
并使用它?我想在管理器定义中指定过滤器kwargs。这里不需要元编程或任何特别聪明的东西。你只需要提取变化的部分。在这种情况下,它只是过滤器的参数:您可以使用参数传递的字典形式,并将过滤器作为字符串存储在类属性中
class AbstractManager(models.Manager):
def get_queryset(self, user):
if user.is_superuser:
return super(AbstractManager, self).get_queryset()
return super(AbstractManager, self).get_queryset().filter(**{self.filter: user})
class OwnCompanyManager(AbstractManager):
filter = "companyuser__user"
class OwnPublisherManager(AbstractManager):
filter = "company__companyuser__user"
受丹尼尔回答的启发:
class OwnManager(models.Manager):
def __init__(self, key):
super(OwnManager, self).__init__()
self.k = key
def get_queryset(self, user):
if user.is_superuser:
return super(OwnManager, self).get_queryset()
return super(OwnManager, self).get_queryset().filter(**{self.k: user})
class Company(models.Model):
name = models.CharField(max_length=45)
objects = models.Manager()
own = OwnManager("companyuser__user")
class Publisher(models.Model):
company = models.ForeignKey(Company)
allow_latest_dev = models.BooleanField(default=False)
domains_blocked = models.BooleanField(default=False)
objects = models.Manager()
own = OwnManager("company__companyuser__user")
这样我就不想为每个模型创建愚蠢的类
谢谢你,丹尼尔。这看起来好多了。但是,有没有可能有AbstractManager而没有其他类?即,在模型定义中构造Manager类?