2017-03-06 21 views
9

मेरे पास django में एक मॉडल है जिसमें उपयोगकर्ता मॉडल के साथ विदेशीकी है।मैं _delete विशेषता का उपयोग कर उपयोगकर्ता मॉडल के साथ विदेशीकी फ़ील्ड में उपयोगकर्ता का पूरा नाम कैसे सेट कर सकता हूं?

class News(models.Model): 
    user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.SET(???)) 
    message - models.TextField() 

तो जब कोई उपयोगकर्ता खाता डेटाबेस से हटा देता है तो समाचार तालिका प्रविष्टियों में भी उपयोगकर्ता के अनुसार हटा दिया जाता है। इसलिए मैं मैं का उपयोग कर उपयोगकर्ता क्षेत्र में उसकी/उसके पूरे नाम निर्धारित करने की आवश्यकता जब किसी भी उपयोगकर्ता खाता फिर हटा दिया है कि चाहते 'on_delete=models.SET(???)'

उदाहरण:

अगर मैं उपयोगकर्ता कि FIRST_NAME = 'नीरज' और last_name है = 'कुमार' जब मैं उस उपयोगकर्ता खाते को हटाना चाहता हूं तो समाचार तालिका में मैं उसका नाम सहेजना चाहता हूं।

उत्तर

9

userNews में मॉडल User मॉडल उदाहरण के लिए मॉडल मानचित्र।

आप इस क्षेत्र में एक स्ट्रिंग असाइन नहीं कर सकते हैं। आप केवल User मॉडल उदाहरण को शून्य कर सकते हैं।

आपको हटाए गए उपयोगकर्ता की जगह रखने के लिए एक विकल्प उपयोगकर्ता प्रदान करना होगा। तो या तो प्रतिस्थापन के लिए उपयोगकर्ता को आरक्षित करें या हटाने के समय एक बनाएं। यह docs में बहुत स्पष्ट रूप से समझाया गया है।

एक चीज जो आप कर सकते हैं वह फ़ील्ड News मॉडल में जोड़ने और News उदाहरण बनाते समय इसे पॉप्युलेट करना है।

class News(models.Mode): 
    user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.SET_NULL) 
    name = models.CharField() 

    def save(self, *args, **kwargs): 
     if not self.id: 
      self.name = self.user.first_name + self.user.last_name 
     super(News, self).save(*args, **kwargs) 

अब जब User हटा दी जाती है, user फ़ील्ड रिक्त करने के लिए सेट कर दिया जाता है और name फ़ील्ड की आवश्यकता नाम में जानकारी शामिल है।

+1

हालांकि यह एक अच्छा समाधान है, जैसा कि यह खड़ा है, विदेशी कुंजी कोई उद्देश्य नहीं देती है। हां, रिवर्स रिलेशनशिप है, लेकिन आपको "लेखक नाम द्वारा पोस्ट ढूंढें" को लागू करना होगा और उन चीज़ों के लिए अतिरिक्त तर्क जोड़ें जिन्हें हटाए गए लेखक के लिए अब संभव नहीं है। सबसे अच्छा समाधान उपयोगकर्ताओं को हटाने की अनुमति नहीं देना है, लेकिन उन्हें निष्क्रिय करें। यही कारण है कि उपयोगकर्ता मॉडल पर 'is_active' है। – Melvyn

0

पिछले उत्तर में, आप विदेशी कुंजी फ़ील्ड में स्ट्रिंग मान असाइन नहीं कर सकते हैं। इस ऑन-डिलीट दृष्टिकोण के साथ, आप इस मामले में हटाए गए किसी विशेष उपयोगकर्ता को कुछ असाइन कर सकते हैं। इसके अलावा, यदि आप वास्तव में किसी अन्य फ़ील्ड में उपयोगकर्ता का नाम असाइन करना चाहते हैं, तो आप इसे Django सिग्नल के साथ कर सकते हैं। On_delete के साथ कुछ भी नहीं कर सकता है।

from django.conf import settings 
from django.contrib.auth import get_user_model 
from django.db import models 

def get_sentinel_user(): 
    return get_user_model().objects.get_or_create(username='deleted')[0] 

class MyModel(models.Model): 
    user = models.ForeignKey(
     settings.AUTH_USER_MODEL, 
     on_delete=models.SET(get_sentinel_user), 
    ) 
संबंधित मुद्दे

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