2013-06-02 17 views
5

Django 1.5+ हमें उपयोगकर्ता को कस्टम फ़ील्ड जोड़ने की अनुमति देता है। मैं इस तथ्य का उपयोग करना चाहता हूं, लेकिन मुझे जरूरी नहीं है कि अच्छी प्रैक्टिस क्या है। यहां एक ऐसी स्थिति है जिसे मैं मॉडल को संभालने के तरीके पर उलझन में हूं।Django 1.5 + उपयोगकर्ता मॉडल संबंध

, User को फ़ील्ड्स जोड़ने के लिए है, तो एक परियोजना केवल User का एक प्रकार है, का कहना है कि एक Student मॉडल की सुविधा देता है विकल्प को देखते हुए, मैं बस User के छात्र-विशिष्ट फ़ील्ड जोड़ सकते हैं? मैं Django के लिए नया हूँ, लेकिन मेरा मानना ​​है कि विकल्प सामान्य User सेटिंग्स सेट अप करना होगा, और Student मॉडल बनाएं, और इसमें एक-से-एक अद्वितीय फ़ील्ड उपयोगकर्ता को कॉल करें।

क्या आप किसी मॉडल की नकल करने के लिए कभी भी Django User के फ़ील्ड का विस्तार करना चाहिए, भले ही प्रोजेक्ट की गारंटी केवल एक प्रकार का उपयोगकर्ता हो?

उत्तर

12

यदि आपके पास केवल एक प्रकार का उपयोगकर्ता है और Django 1.5+ का उपयोग कर रहे हैं, तो मैं नए सार तत्व का लाभ लेने की सलाह दूंगा। Extending Django's default user

एक उदाहरण है जहाँ आप जन्म और पसंदीदा रंग की तारीख जोड़ना चाहते हैं के रूप में:

#myusers/models.py 
from django.contrib.auth.models import AbstractUser 
from django.db import models 

class MyUser(AbstractUser): 
    dob = models.DateField() 
    favorite_color = models.CharField(max_length=32, default='Blue') 

आप और अधिक लचीलापन आप AbstractUser के बजाय AbstractBaseUser विस्तार कर सकते हैं की जरूरत है, लेकिन सबसे बुनियादी मामलों के लिए आप केवल आवश्यकता चाहिए AbstractUser।

यह भी ध्यान दें कि किसी भी मामले में, आपको reference your user model by using settings.AUTH_USER_MODEL की आवश्यकता होगी।

उदाहरण बाहर का उपयोग करते हुए ऊपर और एप्लिकेशन उस में myusers कहा जाता है परिभाषित किया गया था यह सोचते हैं:

#settings.py 
AUTH_USER_MODEL = 'myusers.MyUser' 

विधि आप उपयोगकर्ता मॉडल के लिए एक एक-से-एक क्षेत्र के साथ एक छात्र मॉडल बनाने का उल्लेख अभी भी काम करता है , लेकिन यह उतना साफ नहीं है (अभी भी ऐसे मामले हैं जहां यह समझ में आता है यदि आपके पास कई प्रकार के उपयोगकर्ता हैं)।

मैं सामान्य रूप से उत्तर में पुस्तकों को संदर्भित करना पसंद नहीं है, लेकिन मैंने पाया कि Two Scoops of Django's, उपयोगकर्ता मॉडल पर अध्याय 16 जहां विभिन्न विकल्पों ऑनलाइन Django के वर्तमान संस्करण की तुलना में उपयुक्त हैं की एक बहुत स्पष्ट विवरण दिया डॉक्स। पुस्तक समग्र रूप से Django के लिए एक बहुत ही उपयोगी परिचय है और 1.5 के आधार पर लिखा गया था। आपको पुस्तक खरीदनी होगी या उसे ढूंढना होगा, हालांकि ... (एफवाईआई: मुझे यह सलाह देने के लिए कोई पैसा नहीं मिलता है)।

इस अतः प्रश्न/उत्तर पर एक नज़र ले सकता है: https://stackoverflow.com/a/14104748/307293

+0

इसके बारे में क्या साफ नहीं है? –

+3

यह डेटाबेस में एक अतिरिक्त तालिका बनाता है। यदि आप अपनी कुछ कस्टम जानकारी के साथ अक्सर पहले नाम और अंतिम नाम जैसी चीजों का संदर्भ दे रहे हैं जिसके लिए हर बार एक अतिरिक्त जॉइन की आवश्यकता होती है। – Jacinda

+0

जैकिंडा - संयोग से मैंने पहले किताब खरीदी थी! मुझे अभी तक नहीं मिला है, लेकिन उस संदर्भ को देखते हुए, वे तीन अच्छे विकल्प देते हैं: किसी संबंधित मॉडल, सबक्लास सारस्ट्रूसर, या सबक्लास सारबस क्लासयूसर से वापस लिंक करना। दुर्भाग्य से मैं एक तृतीय पक्ष ऐप का उपयोग कर रहा हूं जिसे मैं उपclass करना चाहता हूं, यह कैसे करना है इस पर कोई विचार है? – Joker

0

आपको डीजेंगो को User मॉडल (प्रमाणीकरण ढांचे से) का स्पर्श नहीं करना चाहिए। यह उन्नयन तोड़ देगा और आप नहीं जानते कि इसके अन्य परिणाम क्या हो सकते हैं।

ऐसा करने के दो बुनियादी तरीके हैं:

  1. तुम सिर्फ एक उपयोगकर्ता के बारे में अतिरिक्त जानकारी स्टोर करने की जरूरत है, लेकिन, एक मॉडल बनाने के लिए कैसे प्रमाणीकरण/प्राधिकरण तंत्र काम करता है को बदलने की जरूरत नहीं है, तो और OneToOneField को User मॉडल में जोड़ें। इस मॉडल में, किसी भी अन्य विविध जानकारी स्टोर करें।

  2. यदि आप बदलना चाहते हैं कि प्रमाणीकरण कैसे काम करता है तो आप create your own User model कर सकते हैं और django इसका उपयोग कर सकते हैं (1.5+ केवल)।

+5

यह सही नहीं है आप 1.5 में नई एप्लिकेशन शुरू कर रहे हैं अगर। यदि आपको अतिरिक्त फ़ील्ड जोड़ने की आवश्यकता है तो नया सर्वोत्तम अभ्यास AbstractUser से प्राप्त करना है। – Jacinda

+0

नहीं, जब आप उपयोगकर्ता मॉडल _replacement_ बना रहे हैं, तो आप केवल AbstractUserModel से प्राप्त होते हैं; और यदि आप सिर्फ एक फ़ील्ड जोड़ना चाहते हैं तो आपको ऐसा नहीं करना चाहिए। यदि आप अपने आवेदन के लिए प्रमाणीकरण/प्राधिकरण प्रक्रिया कैसे काम करेंगे, तो आपको कुछ मौलिक परिवर्तन लागू करने पर आपको अपना खुद का उपयोगकर्ता मॉडल प्रतिस्थापन बनाना चाहिए। –

+3

मैं सार तत्वबेसर के बारे में बात नहीं कर रहा हूं, जो प्रतिस्थापन बना रहा है। मैं सार तत्व के बारे में बात कर रहा हूँ। दस्तावेज़ों से: "यदि आप Django के उपयोगकर्ता मॉडल से पूरी तरह से खुश हैं और आप बस कुछ अतिरिक्त प्रोफ़ाइल जानकारी जोड़ना चाहते हैं, तो आप बस django.contrib.auth.models.AbstractUser subclass कर सकते हैं और अपने कस्टम प्रोफ़ाइल फ़ील्ड जोड़ सकते हैं। यह वर्ग प्रदान करता है एक अमूर्त मॉडल के रूप में डिफ़ॉल्ट उपयोगकर्ता का पूर्ण कार्यान्वयन। " – Jacinda

संबंधित मुद्दे