2017-02-06 40 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。這是我的問題。 –