2017-02-06 41 views
1

简单的问题,但我很努力。优雅的方式来处理Python类/方法命名的冗余字

我想创建一个自定义对象经理一个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() 

OK,这个问题是多余的经理字。我不想删除最后一个词,只是留下“UserManager”而没有真正说出该班级应该做什么,但重复这个词感觉就像做错了一样。

有没有更优雅的方式来做到这一点?

+0

你为什么决定首先调用它?我不确定这个问题是否适合StackOverflow,因为它似乎是主观意见的问题。 Django并不在乎你所说的类是什么,但是对于只使用'FooManager'作为models.Manager的子类是一个有用的约定。 –

+0

只需将user_manger重命名为'user'并将子类重命名为'UserManager' – postoronnim

+0

@HåkenLid我的问题基于这样的事实:python有一个非常宽泛的建议,提示代码是如何存在的。更像那样。我的意思是,我知道以Manager结尾的课程名称不是强制性的,但它是一个约定。我的问题是所有关于Python的类命名传递 –

回答

2

默认情况下,Django为每个Django模型类添加一个名为对象的Manager。但是,如果要将对象用作字段名称,或者如果要使用管理器对象以外的名称,则可以在每个模型的基础上对其进行重命名。要为给定类重命名管理器,请在该模型上定义类型为models.Manager()的类属性。例如:

from django.db import models 

class Person(models.Model): 
    #... 
    people = models.Manager() 

使用这个示例模型,Person.objects会产生AttributeError异常,但Person.people.all()将提供所有Person对象的列表。

You can find further information on managers, and the best practices using them at this link

1

好,Manager s时,可以叫任何你想要的。在特定情况下,你可以使用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. 

...这是不是最好的呼叫(比较W¯¯ ith Clearance.objects.all() - 这很明显,很明显 - 技术支持和user_manager方法不太清晰,这在一定程度上是您问题的根源,imo。

+0

我的关注点更多地是关于类名称上的冗余而不是属性中的冗余。我的意思是,即使我将该属性重命名为其他任何名称,按照惯例,Manager类名称仍将以单词Manager结尾。所以,如果我想让一个django管理者与我的项目中的管理者处理用户,按照惯例,我的django管理者类将是ManagerManager。我知道这很愚蠢,但我只想知道该怎么做。命名我的班级Manager_Manager或ManagerObjectManager。这是我的问题。 –