2013-07-09 21 views
5

Django özel kullanıcı modeline (CustomUser) geçiş yaptım, bu modelde başka modellerde yabancı anahtar ve M2M ilişkileri var. CustomUser ayrıca Zinnia'nın yazar modeli (Yazar) tarafından alt sınıflıdır - Zinnia mükemmel bir üçüncü parti blog uygulaması.Django özel kullanıcı modeli alt sınıf (by Zinnia)

Sorunum, CustomUser öğesine bir ilişki aracılığıyla erişebildiğimde, örneğin OtherModel.customuser bir CustomUser örneğini döndürür, ancak isteklere eriştiğimde görünümlerim arasında.Kullanıcı bir örneğidir. Author ve CustomUser öznitelikleri özdeş olduğu için bu genel olarak çok fazla bir fark yaratmıyor, ancak Görünümlerimdeki kullanıcı nesnelerinin eşdeğerliğini test etmek istiyorsam, request.user yerine user.user.id kullanmam gerekiyor ve ben de içgüdüsel olarak ' Hangi modelle uğraştığımın belirsizliğini seviyorum.

Muhtemelen, her şeyi göründüğümden daha iyi ele alıyorum ve her şey işime yaramıyor. Mükemmel bir dünyada, yine de, aynı Kullanıcı modeline tutarlı bir şekilde atıfta bulunacağım ama en iyi nasıl ilerleyeceğinden emin değilim. Herhangi bir fikir?

class CustomUser(AbstractUser): 

    visits = models.PositiveIntegerField(
     _('visits'), 
     default=0, 
     blank=True 
    ) 

    def __unicode__(self): 
     return self.username 

class OtherModel(models.Model): 

    author = models.ForeignKey(CustomUser) 

(profiller uygulamada)

settings.py

AUTH_USER_MODEL = 'profiles.CustomUser' 

models.py ben documentation yılında öneri ile doğrudan settings.AUTH_USER_MODEL ile ilişkisini yapmaktır ziyade biliyorum özel kullanıcı modeli. Bunu değiştirmek için plan ama bir göçün acısını tekrar başlatmadan önce ne yaptığımı anlamak istiyorum

Konsol get_user_model (In
from django.contrib.auth import get_user_model 


@python_2_unicode_compatible 
class Author(get_user_model()): 
    """ 
    Proxy model around :class:`django.contrib.auth.models.get_user_model`. 
    """ 

    objects = get_user_model()._default_manager 
    published = EntryRelatedPublishedManager() 

) profillerini döndürür author.py (zinnia uygulamasında) .models.CustomUser class

+1

aynı olması konu. bir çözüm buldun mu? – Blaise

cevap

0

Sanırım sorununuzu çözüyorum.

Varsayılan olarak, Django model örneklerini downcast etmez. Exemple için aşağıdaki örneği inceleyelim:

from django.db import models 

class Parent(models.Model): 
    name = models.CharField() 

class Child(Parent): 
    pass 

Parent(name="parent").save() 
Child(name="child").save() 

Parent.objects.all() # will return Parent instances 
Child.objects.all() # will return Child instances 

sizin durumda, iyi, Zinnia Author örnekle çalışarak var ve CustomUser örneği ile projenizin kalanı. Yani temel olarak her CustomUser örneğini deşifre edebilirsiniz. Bunu, django-polymorphic gibi mevcut bir django uygulamasını kullanarak (ki bence, beton mirasla çalışırken sahip olmak şarttır) kullanarak yapabilirsiniz. Tüm kullanıcılar değil yazarları ise Ancak, Ayrıca uzlaşma ve aşağıdaki gibi manuel upcast uygulayabilir

vidalı konum:

from django.contrib.auth import get_user_model 

class CustomUser(AbstractUser): 

    # your logic... 

    def as_custom_user(self): 
     return super(get_user_model(), self) 

Kullanımı:

assert request.user.as_custom_user() == article.author.as_custom_user() 
İlgili konular