2010-02-02 16 views
30

Bir kullanıcı nesnesini genişletme şekline benzer ek özellikler eklemek için yerleşik Django Group nesnesini genişletmenin bir yolu var mı? Herhangi eşdeğer var mıDjango Group modelini nasıl genişletirim?

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

: Size alır settings.py dosyasının

AUTH_PROFILE_MODULE = 'app.UserProfile' 

için aşağıdaki

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

ve ekleyin: Bir kullanıcı nesnesi ile, aşağıdakileri yapabilirsiniz Bir grubu genişletmek için bu yaklaşıma? Yoksa, yapabileceğim alternatif bir yaklaşım var mı?

cevap

17

Grup alt sınıflarını gruplandıran, kendi alanlarınızı ekleyen ve gereksinim duyduğunuz özel sorguları döndürmek için bir Model Yöneticisi'ni kullanan bir model oluşturabilirsiniz. sadece o zaman varsayılan olarak cevap vermem yeni bir veritabanı tablosu ve yönetici sitesini yaratacak Grup nesnesi alt sınıf ise

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

: İşte Grubu bir okul ile ilişkili aileler temsil etmek uzatıldı gösteren kesik örnek yeni alanlar.

Sen varolan Grubuna yeni alanlar enjekte etmek gerekir:

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

Grubuna yöntemleri eklemek, alt sınıf ancak vekil olarak modelini etiketlemek için:

class MyGroup(Group): 

    class Meta: 
     proxy = True 

    def myFunction(self): 
     return True 
+0

bunun için teşekkür ederiz! – Simanas

+6

'if olmasın (Grup ...' satırı git – ModernCarpentry

+0

Bunu MyGroup'ın yukarısındaki models.py dosyasına yerleştirebilirsiniz – Mark

İlgili konular