2013-07-09 11 views
5

Przeprowadziłem migrację do niestandardowego modelu użytkownika Django (CustomUser), na który kilka innych modeli ma relacje klucza obcego i M2M. CustomUser jest również podklasowany przez autorski model Zinni (Autor) - Zinnia to doskonała aplikacja do blogowania stron trzecich.Django niestandardowy model użytkownika podklasowany (przez Zinnia)

Mój problem polega na tym, że kiedy uzyskuję dostęp do CustomUser poprzez relację np. OtherModel.customuser, zwraca ona instancję CustomUser, ale w moich widokach, gdy uzyskuję dostęp do request.User, jest to instancja Author. Ponieważ atrybuty Author i CustomUser są identyczne, ogólnie rzecz biorąc nie robi to wielkiej różnicy, ale jeśli chcę przetestować równoważność obiektów użytkowników w moich widokach, muszę do użytkownika request.user.id zamiast request.user, a ja instynktownie nie " T jak dwuznaczność, z którym mam do czynienia.

Prawdopodobnie lepiej przechodzę nad tym i zostawiam rzeczy takimi, jakie są, ponieważ wszystko działa po kilku drobnych zmianach kodu w moich widokach. Jednak w idealnym świecie odnoszę się konsekwentnie do tego samego modelu użytkownika, ale nie jestem pewien, jak najlepiej postępować. Jakieś pomysły?

settings.py

AUTH_USER_MODEL = 'profiles.CustomUser' 

models.py (w profilach aplikacji)

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) 

wiem zalecenie w documentation jest, aby relacje z settings.AUTH_USER_MODEL zamiast bezpośrednio z niestandardowy model użytkownika. Mam zamiar to zmienić, ale chce zrozumieć, co robię przed uruchomieniem ponownie pod groźbą migracji

author.py (w cynia aplikacji)

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

W get_user_model konsoli() zwraca profili .models.CustomUser klasa

+1

mam takie same kwestia. Znalazłeś rozwiązanie? – Blaise

Odpowiedz

0

Myślę, że dostaję twój problem.

Domyślnie Django nie przerzuca modeli instancji. Dla exemple podjąć następujący przykład:

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 

W sytuacji, dobrze, masz Zinnia pracy z Author przypadkach, a reszta projektu z CustomUser instancji. Zasadniczo można spuścić co każdą instancję klasy CustomUser. Możesz to osiągnąć za pomocą istniejącej aplikacji django, takiej jak django-polymorphic (która, moim zdaniem, jest niezbędna przy pracy z dziedziczeniem konkretnym). Jednakże, jeśli wszyscy użytkownicy nie są autorami, masz przerąbane

Można również kompromis, i wdrożyć ręcznego uskok następująco:

from django.contrib.auth import get_user_model 

class CustomUser(AbstractUser): 

    # your logic... 

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

Zastosowanie:

assert request.user.as_custom_user() == article.author.as_custom_user() 
Powiązane problemy