2010-02-02 5 views
30

Existe-t-il un moyen d'étendre l'objet Groupe Django intégré pour ajouter des attributs supplémentaires de la même manière que vous pouvez étendre un objet utilisateur? Avec un objet utilisateur, vous pouvez effectuer les opérations suivantes:Comment étendre le modèle du groupe Django?

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 

et ajoutez ce qui suit au fichier settings.py

AUTH_PROFILE_MODULE = 'app.UserProfile' 

qui vous obtient:

profile = User.objects.get(id=1).get_profile() 

Y at-il équivalent à cette approche pour étendre un groupe? Sinon, y a-t-il une approche alternative que je peux prendre?

Répondre

17

Vous pouvez créer un modèle qui sous-groupe Groupe, ajouter vos propres champs et utiliser un Gestionnaire de modèles pour renvoyer tous les ensembles de requêtes personnalisés dont vous avez besoin. Voici un exemple tronqué montrant comment I Groupe étendu pour représenter les familles associées à une école:

from django.contrib.auth.models import Group, User 

class FamilyManager(models.Manager): 
    """ 
    Lets us do querysets limited to families that have 
    currently enrolled students, e.g.: 
     Family.has_students.all() 
    """ 
    def get_query_set(self): 
     return super(FamilyManager, self).get_query_set().filter(student__enrolled=True).distinct() 


class Family(Group): 
    notes = models.TextField(blank=True) 

    # Two managers for this model - the first is default 
    # (so all families appear in the admin). 
    # The second is only invoked when we call 
    # Family.has_students.all() 
    objects = models.Manager() 
    has_students = FamilyManager() 

    class Meta: 
     verbose_name_plural = "Families" 
     ordering = ['name'] 

    def __unicode__(self): 
     return self.name 
36

Si vous sous-classe simplement l'objet du groupe puis par défaut, il va créer une nouvelle table de base de données et le site d'administration ne détectera pas de nouveaux champs

Vous devez injecter de nouveaux champs dans le groupe existant:

if not hasattr(Group, 'parent'): 
    field = models.ForeignKey(Group, blank=True, null=True, related_name='children') 
    field.contribute_to_class(Group, 'parent') 

Pour ajouter des méthodes au groupe, sous-classe mais étiquette le modèle comme proxy:

class MyGroup(Group): 

    class Meta: 
     proxy = True 

    def myFunction(self): 
     return True 
+0

Merci pour cela! – Simanas

+6

Où va la ligne 'if not hasattr (Group ...'?) – ModernCarpentry

+0

Vous pouvez le placer dans models.py ci-dessus MyGroup – Mark

Questions connexes