2017-02-06 2 views
1

Einfache Frage, aber ich habe damit zu kämpfen.Elegante Art, mit redundanten Wörtern auf Python-Klasse/Methodenbenennung umzugehen

Ich mag einfach so einen benutzerdefinierte Objekt-Manager zu einem Django-Modell erstellen:

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, das Problem ist das redundante Manager-Wort. Ich habe nicht das Gefühl, das letzte Wort zu entfernen und "UserManager" einfach zu verlassen, ohne wirklich zu sagen, was diese Klasse tun soll, aber das Wort zu duplizieren fühlt sich an, als wäre es das Falsche.

Gibt es einen eleganteren Weg?

+0

Warum haben Sie sich entschieden, das überhaupt zu nennen? Ich bin mir nicht sicher, ob diese Frage zu StackOverflow passt, da es sich um eine subjektive Meinung handelt. Django ist es egal, wie Sie Ihre Klassen nennen, aber es ist eine nützliche Konvention, nur 'FooManager' für Unterklassen von models.Manager zu verwenden. –

+0

benenne einfach user_manger in 'user' und die Unterklasse in 'UserManager' um. – postoronnim

+0

@ HåkenLid meine Frage basiert auf der Tatsache, dass Python eine sehr breite Empfehlung hat, Hinweise darüber, wie der Code sein sollte. Ist eher so. Ich meine, ich weiß, dass der Name der Klasse, die mit Manager endet, nicht obligatorisch ist, aber es ist eine Konvention. Meine Frage ist alles darüber, Klassenbenennung Konvektion auf Python –

Antwort

2

Standardmäßig fügt Django jeder Django-Modellklasse einen Manager mit den Namen-Objekten hinzu. Wenn Sie Objekte jedoch als Feldnamen verwenden oder einen anderen Namen als Objekte für den Manager verwenden möchten, können Sie ihn für jedes Modell umbenennen. Um den Manager für eine bestimmte Klasse umzubenennen, definieren Sie ein Klassenattribut vom Typ models.Manager() für dieses Modell. Zum Beispiel:

from django.db import models 

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

dieses Beispiel Modell, Person.objects wird eine Attribut Ausnahme erzeugen, aber Person.people.all() wird eine Liste aller Objekte Person bieten.

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

1

Nun, man kann Manager s aufgerufen werden, was Sie wollen. In Ihrem speziellen Fall könnten Sie eine managers.py-Datei verwenden (anstatt sie in models.py hat) - es ganz offensichtlich wird (und etwas weniger redundant) es etwas zu tun, wie folgt aus:

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

und Ihre Manager-Datei offensichtlich habe:

from django.db import models 

class TechSupportManager(models.Manager): 
    # your manager methods here 
    pass 


class UserManager(models.Manager): 
    # your manager methods here 
    pass 

ich, dass dies in Form genannt würde darauf hinweisen würde:

import Clearance 

techsupport_results = Clearance.tech_support.all() 
#or whatever methods you define there. 

... dass nicht der schönste Anruf (vergleiche ist w it Clearance.objects.all() - es ist klar und offensichtlich, was das ist - die Methoden techsupport und user_manager sind weniger klar, was teilweise die Wurzel Ihrer Frage ist, imo.

+0

mein Anliegen ist mehr über die Redundanz für den Klassennamen als in dem Attribut. Ich meine, selbst wenn ich das Attribut in etwas anderes umbenenne, wird der Name der Manager-Klasse per Konvention immer noch mit dem Wort Manager enden. Also, wenn ich wollte, dass ein Django-Manager mit Benutzern mit Managern in meinem Projekt umgeht, ist meine Django-Manager-Klasse per Vereinbarung ManagerManager. Ich weiß, dass es albern ist, aber ich will nur wissen, was ich in diesem Fall tun soll. Benennen Sie meine Klasse Manager_Manager oder ManagerObjectManager. Das ist meine Frage. –

Verwandte Themen