2017-02-06 4 views
1

簡単な質問ですが、私はそれに苦しんでいます。私はちょうどこのようにDjangoのモデルにカスタムオブジェクトマネージャを作成したいpythonクラス/メソッドのネーミングで重複した言葉を扱う優雅な方法

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はあなたがクラスと呼ぶものを気にしませんが、models.Managerのサブクラスには 'FooManager'だけを使うのが便利です。 –

+0

user_mangerの名前を 'user'に変更し、サブクラスを 'UserManager'に変更してください。 – postoronnim

+0

@HåkenLid私の質問は、pythonがどのようにコードがどのように提唱されているかについての非常に幅広いヒントがあるという事実に基づいています。それはもっとそうです。私は、マネージャーで終わるクラスの名前は必須ではないが、それは大会だということを知っている。私の質問はそれに関するものです。Pythonでのクラス命名のコンビネーション –

答えて

2

デフォルトでは、DjangoはすべてのDjangoモデルクラスにオブジェクトという名前のManagerを追加します。ただし、オブジェクトをフィールド名として使用する場合や、マネージャ以外のオブジェクト名を使用する場合は、モデルごとに名前を変更することができます。特定のクラスの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が好きな呼び出すことができます。

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() 

とあなたのマネジャーは明らかにファイル:それをこのような何かをすることは非常に明白になり(と少し冗長) - あなたの特定のケースでは、(むしろmodels.pyでそれらを持つより)managers.pyファイルを使用することができますあり:

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. 

...それは素敵なコール(ワットを比較しませんith Clearance.objects.all() - それが何をしているのかはっきりしています.techsupportとuser_managerの方法はあまり明確ではありませんが、これは部分的にあなたの質問の根源です。

+0

私の関心事は、クラス名の冗長性が属性よりも重要です。つまり、属性の名前を他のものに変更しても、Managerのクラス名は、慣例によってManagerという名前で終わります。だから、もし私がジャンゴマネージャーが私のプロジェクトのマネージャーであるユーザーを扱うようにしたいのであれば、私のdjangoマネージャークラスはManagerManagerになります。私はそれが愚かであることを知っていますが、私はその場合に何をすべきかを知りたいだけです。私のクラスの名前をManager_ManagerまたはManagerObjectManagerにします。それは私の質問です。 –

関連する問題