2009-05-29 13 views
6

मैं Django में एक ऑनलाइन स्टोर (सिर्फ एक बुनियादी खरीदारी अभी गाड़ी) पर काम कर रहा हूँ के रूप में अज्ञात उपयोगकर्ताओं ही कार्यक्षमता देते हैं, और मैं (उन पसंदीदा के रूप में आइटम चिह्नित करने के लिए के लिए कार्यक्षमता जोड़ने के लिए बस की तरह की योजना बना रहा हूँ स्टैक ओवरफ्लो में)। कार्ट के लिए मॉडल इस तरह कुछ दिखते हैं:पंजीकृत कराए

class Cart(models.Model): 
    user = models.OneToOneField(User) 

class CartItem(models.Model): 
    cart = models.ForeignKey(Cart) 
    product = models.ForeignKey(Product, verbose_name="produs") 

पसंदीदा मॉडल दो पंक्तियों के साथ एक तालिका होगी: उपयोगकर्ता और उत्पाद।

समस्या यह है कि यह केवल पंजीकृत उपयोगकर्ताओं के लिए काम करेगा, क्योंकि मुझे उपयोगकर्ता ऑब्जेक्ट की आवश्यकता है। मैं अनियंत्रित उपयोगकर्ताओं को इन सुविधाओं का उपयोग करने, कुकीज/सत्र में डेटा को सहेजने, और जब वे पंजीकरण करने का निर्णय लेते हैं, तो डेटा को उनके उपयोगकर्ता को कैसे स्थानांतरित कर सकते हैं?

मुझे लगता है कि एक विकल्प सामान्य प्रकार के सामान्य संबंध होंगे, लेकिन मुझे लगता है कि यह जटिल है। हो सकता है कि उपयोगकर्ता के बाद एक अतिरिक्त पंक्ति हो, जो एक सत्र वस्तु है (मैंने वास्तव में अब तक django में सत्रों का उपयोग नहीं किया है), और यदि उपयोगकर्ता किसी के लिए सेट नहीं है, तो इसका उपयोग करें?

तो मूल रूप से, मैं क्या पूछना चाहता हूँ, अगर आप इस समस्या से पहले मिला है, आप इसे कैसे हल किया, क्या सबसे अच्छा तरीका हो सकता है है?

उत्तर

9

मैंने पहले यह नहीं किया है लेकिन आपके विवरण को पढ़ने से मैं बस एक उपयोगकर्ता ऑब्जेक्ट बनाउंगा जब किसी को ऐसा करने की आवश्यकता होती है जिसके लिए इसकी आवश्यकता होती है। फिर आप उपयोगकर्ता को एक कुकी भेजते हैं जो इस उपयोगकर्ता ऑब्जेक्ट से लिंक होता है, इसलिए यदि कोई वापस आ जाता है (अपनी कुकीज़ साफ़ किए बिना) उन्हें समान कंकाल उपयोगकर्ता ऑब्जेक्ट मिलता है।

इसका मतलब है कि आप कम से कम परिवर्तन के साथ अपने वर्तमान कोड का उपयोग कर सकते हैं और आप सिर्फ अपने विवरण के साथ कंकाल उपयोगकर्ता वस्तु को पॉप्युलेट कर सकते हैं, जब वे एक पूर्ण पंजीकृत उपयोगकर्ता को स्थानांतरित करना चाहते हैं।

आप अपने डीबी रखना चाहता तो साफ-ish आप एक काम है कि सभी कंकाल उपयोगकर्ता है कि कहते हैं पिछले 30 दिनों में इस्तेमाल नहीं किया हटाता है जोड़ सकते हैं।

+0

+1: अज्ञात उपयोगकर्ताओं के पास अभी भी आईपी पते हैं जिनका उपयोग बिना किसी पासवर्ड के आवश्यक टेम्पल उपयोगकर्ता आईडी बनाने के लिए किया जा सकता है। जब वे पंजीकरण करते हैं तो आप वास्तव में उन्हें उचित नाम और पासवर्ड रखने के लिए अपग्रेड कर रहे हैं। –

+0

अच्छा विचार, मैंने इसके बारे में नहीं सोचा था। धन्यवाद! –

+4

आईपी पता एक अद्वितीय कुंजी के रूप में इस्तेमाल नहीं किया जा सकता है। फ़ायरवॉल एनएटी के पीछे कई उपयोगकर्ताओं को सोचें। – tzot

2

बस उपयोगकर्ता डेटा को उपयोगकर्ता तालिका को सहेजें और उपयोगकर्ता आईडी/पासवर्ड टेबल को पॉप्युलेट नहीं करें।

यदि कोई उपयोगकर्ता पंजीकृत करता है तो आपको केवल उन फ़ील्ड को पॉप्युलेट करना होगा।

आप किसी भी उपयोगकर्ताओं को, जो कुछ मनमाने ढंग से की अवधि में दौरा नहीं किया है बाहर खाली करने के लिए समय-समय पर कुछ "सफाई" स्क्रिप्ट चलाने करना होगा। मैं यह सफाई वैकल्पिक बना दूंगा। और यदि कोई क्लाइंट मैन्युअल रूप से ऐसा करना चाहता है तो उसे साफ़ करने के लिए एक स्क्रिप्ट है जिसे सर्वरसाइड (या एक वेब एडमिन इंटरफ़ेस के माध्यम से) चलाया जा सकता है।

सभी संबंधित प्रविष्टियों के साथ-साथ उपयोगकर्ता प्रविष्टि को हटाना याद रखें।

4

मुझे लगता है कि यह करने के लिए सबसे आसान तरीका है दोनों प्रयोक्ता आईडी या सत्र id स्टोर करने के लिए किया जाएगा: जब कोई उपयोगकर्ता रजिस्टर, आप अपने request.session.session_key लेने के लिए और सभी पंक्तियों को अपडेट कर सकते

class Cart(models.Model): 
    user = models.ForeignKey(User, null=True) 
    session = models.CharField(max_length=32, null=True) 

फिर, उनके नए उपयोगकर्ता आईडी के साथ।

अभी तक बेहतर, आप एक "UserProxy" मॉडल निर्धारित कर सकते हैं:

class Cart(models.Model): 
    user = models.ForeignKey(UserProxy) 

class UserProxy(models.Model): 
    user = models.ForeignKey(User, unique=True, null=True) 
    session = models.CharField(max_length=32, null=True) 

तो फिर तुम सिर्फ UserProxy तालिका अद्यतन करने के लिए जब वे रजिस्टर है, और गाड़ी के बारे में कुछ भी नहीं बदलने के लिए है।

+0

क्या आप 'user = models.ForeignKey (उपयोगकर्ता, अद्वितीय = सही, शून्य = सही) 'पंक्ति में' अद्वितीय = सही 'चाहते हैं। फिर आपके पास उनके सत्र द्वारा परिभाषित एकाधिक 'शून्य' उपयोगकर्ता नहीं हो सकते हैं, क्या आप? –

0

मुझे लगता है कि आप सत्रों का उपयोग करने के बारे में सोचने के सही रास्ते पर थे।मैं उपयोगकर्ता आईडी में उत्पाद आईडी की एक सूची संग्रहीत करता हूं और फिर जब उपयोगकर्ता पंजीकृत होता है, तो एक कार्ट बनाएं जैसा आपने परिभाषित किया है और फिर आइटम जोड़ें। session docs देखें।

आप उन लोगों को अनुमति दे सकते हैं जो या तो लॉग इन नहीं हैं या 'temp' कार्ट में आइटम जोड़ने के लिए कोई खाता नहीं है। जब व्यक्ति किसी भी खाते में लॉग इन करता है या एक नया खाता बनाता है, तो उन वस्तुओं को उनके 'असली' कार्ट में जोड़ें। फिर बस 'कार्ट में आइटम जोड़ें' और लॉगिन फ़ंक्शंस में कुछ पंक्तियां जोड़कर, आप अपने मौजूदा मॉडल का उपयोग कर सकते हैं।

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