2013-07-09 58 views
5

我已經遷移到Django自定義用戶模型(CustomUser),其中幾個其他模型具有外鍵和M2M關係。 CustomUser也被Zinnia的作者模型分類(作者) - Zinnia是一款優秀的第三方博客應用程序。Django自定義用戶模型子類(由百日草)

我的問題是,當我通過關係如OtherModel.customuser訪問CustomUser時,它返回CustomUser的一個實例,但在我的視圖中訪問request.User時,它是Author的一個實例。由於作者和CustomUser的屬性是相同的,這通常不會有太大的區別,但如果我想在我的視圖中測試用戶對象的等價性,我必須用戶request.user.id而不是request.user,我本能地不'不喜歡我正在處理的模型的模糊性。

可能我更好地克服它並讓它們保持原樣,因爲在我的視圖中發生了一些小的代碼更改後,所有內容都可以正常工作。儘管如此,在一個完美的世界裏,我會一致地提到相同的用戶模型,但我們不確定如何取得最佳進展。有任何想法嗎?

settings.py

AUTH_USER_MODEL = 'profiles.CustomUser' 

models.py(在配置文件中的應用程序)

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) 

我知道在documentation的建議是,以與settings.AUTH_USER_MODEL的關係,而不是直接與定製用戶模型。我打算改變這一點,但要明白我在做什麼再次啓動到遷移的痛苦之前

author.py(在百日草APP)

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

在控制檯get_user_model()返回概況.models.CustomUser class

+1

我有同樣的問題。你找到解決方案嗎? – Blaise

回答

0

我想我得到你的問題。

默認情況下,Django不會向下轉換模型實例。對於爲例,看看下面的例子:

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 

在你的情況,那麼,你有百日草與Author情況下工作,和你的項目與CustomUser實例休息。所以基本上你可以下載每個CustomUser實例。您可以使用現有的django應用程序來實現此目的,例如django-polymorphic(在我看來,這是使用具體繼承時必須具備的)。然而,如果所有用戶都沒有作者,你就完蛋了

您也可以妥協,並實現手動向上轉型如下:

from django.contrib.auth import get_user_model 

class CustomUser(AbstractUser): 

    # your logic... 

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

用法:

assert request.user.as_custom_user() == article.author.as_custom_user()