简单的问题,但我正在努力解决它。
我想为Django模型创建一个自定义对象管理器,如下所示:
class Clearance(models.Model):
user = models.OneToOneField(User, verbose_name='usuário')
level = models.CharField(choices=PERMISSION_LEVELS, max_length=20, verbose_name='nível')
tech_support = TechSupportManager()
user_manager = UserManagerManager()
好的,问题是冗余的Manager字。我不想删除最后一个字,只需离开" UserManager"没有真正说出那个班级想要做什么,但复制这个词感觉也是错误的事情。
还有更优雅的方法吗?
答案 0 :(得分:2)
默认情况下,Django会为每个Django模型类添加一个名为objects的Manager。但是,如果要将对象用作字段名称,或者如果要使用Manager以外的其他名称,则可以基于每个模型对其进行重命名。要为给定类重命名Manager,请在该模型上定义models.Manager()类型的类属性。例如:
IDisposable
使用此示例模型,Person.objects将生成AttributeError异常,但Person.people.all()将提供所有Person对象的列表。
You can find further information on managers, and the best practices using them at this link
答案 1 :(得分:1)
嗯,Manager
可以随心所欲地调用。在您的特定情况下,您可以使用managers.py
文件(而不是在models.py
中使用它们) - 这样做会变得非常明显(并且不那么多余):
from managers import UserManager, TechSupportManager
class Clearance(models.Model):
user = models.OneToOneField(User, verbose_name='usuário')
level = models.CharField(choices=PERMISSION_LEVELS, max_length=20, verbose_name='nível')
tech_support = TechSupportManager()
user_manager = UserManagerManager()
你的经理文件显然有:
from django.db import models
class TechSupportManager(models.Manager):
# your manager methods here
pass
class UserManager(models.Manager):
# your manager methods here
pass
我会指出这将以以下形式调用:
import Clearance
techsupport_results = Clearance.tech_support.all()
#or whatever methods you define there.
...这不是最好的调用(与Clearance.objects.all()
比较 - 它清楚而明显是什么 - techsupport和user_manager方法不太清楚,这部分是你问题的根源,imo。< / p>