2013-07-09 12 views
5

मैं एक Django कस्टम उपयोगकर्ता मॉडल (CustomUser) में स्थानांतरित हो गया है जिसमें कई अन्य मॉडल विदेशी कुंजी और एम 2 एम संबंध हैं। कस्टम यूज़र को जिन्निया के लेखक मॉडल (लेखक) द्वारा भी उप-वर्गीकृत किया गया है - जिन्निया एक उत्कृष्ट तृतीय पक्ष ब्लॉगिंग ऐप है।Django कस्टम उपयोगकर्ता मॉडल subclassed (ज़िनिया द्वारा)

मेरा मुद्दा यह है कि जब मैं कस्टमयूसर को रिश्ते के माध्यम से एक्सेस करता हूं तो अन्य मॉडेल.customuser यह कस्टम यूज़र का एक उदाहरण देता है, लेकिन मेरे विचारों में जब मैं अनुरोध तक पहुंचता हूं। उपयोगकर्ता यह लेखक का एक उदाहरण है। चूंकि लेखक और कस्टम यूज़र के गुण सामान्य रूप से समान हैं, इसलिए इससे कोई फर्क नहीं पड़ता है, लेकिन यदि मैं अपने विचारों में उपयोगकर्ता ऑब्जेक्ट्स के समतुल्यता का परीक्षण करना चाहता हूं तो मुझे request.user के बजाय उपयोगकर्ता request.user.id करना होगा और मैं सहजता से ' मैं जिस मॉडल के साथ काम कर रहा हूं उस पर अस्पष्टता की तरह।

संभवतः मैं इसे बेहतर तरीके से प्राप्त कर रहा हूं और चीजों को छोड़ रहा हूं क्योंकि वे मेरे विचारों में कुछ मामूली कोड परिवर्तनों के बाद सबकुछ काम करते हैं। एक परिपूर्ण दुनिया में, हालांकि, मैं एक ही उपयोगकर्ता मॉडल के लिए निरंतर संदर्भ दे रहा हूं लेकिन अनिश्चित हूं कि प्रगति कैसे सर्वोत्तम है। कोई विचार?

settings.py

AUTH_USER_MODEL = 'profiles.CustomUser' 

(प्रोफाइल अनुप्रयोग में)

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) 

models.py मैं जानता हूँ कि documentation में सिफारिश settings.AUTH_USER_MODEL के साथ संबंध बनाने के लिए के बजाय के साथ सीधे है कस्टम उपयोगकर्ता मॉडल। मुझे लगता है कि बदलने की योजना है, लेकिन समझने के लिए एक प्रवास के दर्द में फिर से शुरू करने से पहले मैं क्या कर रहा हूँ चाहते

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 (में) रिटर्न प्रोफाइल author.py (zinnia अनुप्रयोग में) .models.CustomUser वर्ग

+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 

, ठीक है, आप Zinnia Author उदाहरणों के साथ काम है, और CustomUser उदाहरण के साथ अपनी परियोजना के बाकी। तो मूल रूप से आप हर CustomUser उदाहरण घटा सकते हैं। आप इसे मौजूदा डीजेंगो एप्लिकेशन का उपयोग करके प्राप्त कर सकते हैं, जैसे कि django-polymorphic (जो मेरी राय में, ठोस विरासत के साथ काम करते समय होना चाहिए)। हालांकि, अगर आपके सभी उपयोगकर्ताओं के लेखकों नहीं हैं, तो आप फँस रहे

तुम भी समझौता कर सकते हैं और इस प्रकार एक मैनुअल Upcast लागू:

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() 
संबंधित मुद्दे