2010-02-02 27 views
30

¿Hay alguna forma de ampliar el objeto integrado del Grupo Django para agregar atributos adicionales similares a la forma en que puede extender un objeto de usuario? Con un objeto de usuario, puede hacer lo siguiente:¿Cómo extiendo el modelo del Grupo Django?

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

y añadir lo siguiente al archivo settings.py

AUTH_PROFILE_MODULE = 'app.UserProfile' 

que se obtiene:

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

¿Hay alguna equivalente a este enfoque para extender un grupo? Si no, ¿hay un enfoque alternativo que pueda tomar?

Respuesta

17

Puede crear un modelo que agrupe subgrupos, agregue sus propios campos y utilice un administrador de modelos para devolver los conjuntos de consulta personalizados que necesite. He aquí un ejemplo truncada mostrando cómo extendido del grupo para representar a las familias asociadas con una escuela:

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 simplemente subclase del objeto Grupo entonces por defecto se creará una nueva tabla de base de datos y el sitio de administración no va a recoger cualquier nuevo campo

que necesita inyectarse nuevos campos en el grupo existente:

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

Para añadir métodos para el Grupo, pero subclase etiquetar el modelo como variable sustitutiva:

class MyGroup(Group): 

    class Meta: 
     proxy = True 

    def myFunction(self): 
     return True 
+0

Gracias por esto! – Simanas

+6

¿Dónde se encuentra la línea 'if not hasattr (Group ...'? – ModernCarpentry

+0

Puede colocarlo en models.py anterior MyGroup – Mark

Cuestiones relacionadas