आप बिना डिफ़ॉल्ट के उपयोगकर्ता के लिए गैर-अशक्त फ़ील्ड 'new_field' जोड़ने का प्रयास कर रहे हैं


109

मुझे पता है कि Django 1.7 से मुझे दक्षिण या किसी अन्य माइग्रेशन सिस्टम का उपयोग करने की आवश्यकता नहीं है, इसलिए मैं केवल साधारण कमांड का उपयोग कर रहा हूं python manage.py makemigrations

हालाँकि, मुझे जो भी मिल रहा है वह यह है:

You are trying to add a non-nullable field 'new_field' to userprofile without a default;
we can't do that (the database needs something to populate existing rows).

यहाँ मॉडल है:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    website = models.URLField(blank=True)
    new_field = models.CharField(max_length=140)

विकल्प क्या हैं?


3
मैं जोड़ना चाहता था कि समस्या तब होती है जब आप मौजूदा तालिका को बदल रहे होते हैं, तब नहीं जब आप एक नया निर्माण कर रहे हों।
x- यूरी

जवाबों:


91

आपको एक डिफ़ॉल्ट मान प्रदान करना होगा:

new_field = models.CharField(max_length=140, default='SOME STRING')

क्या होगा अगर मुझे new_field की वेबसाइट फ़ील्ड की एक प्रति चाहिए। कैसे दिखना चाहिए? default = websiteनौकरी नहीं करता है
इरमंतस iselionis

8
आप पहले माइग्रेशन को एक बोगस डिफ़ॉल्ट मान के साथ करना चाहते हैं, फिर प्रत्येक रिकॉर्ड के माध्यम से पुनरावृति करने और सेट करने के लिए डेटा माइग्रेशन बनाएँ । new_fieldwebsite
21

डिफ़ॉल्ट चारफिल्ड के लिए वैकल्पिक होना चाहिए
फ्लोरेंट

88

यदि आप शुरुआती विकास चक्र में हैं और अपने वर्तमान डेटाबेस डेटा की परवाह नहीं करते हैं तो आप इसे हटा सकते हैं और फिर माइग्रेट कर सकते हैं। लेकिन पहले आपको माइग्रेशन को साफ करना होगा और टेबल से उसकी पंक्तियों को हटाना होगा (django_migrations)

rm  your_app/migrations/*

rm db.sqlite3
python manage.py makemigrations
python manage.py migrate

8
एक और चीज़। आपको माइग्रेशन टेबल को साफ़ करने की आवश्यकता है जैसे:mysql -u[user] [database] -e "delete from django_migrations where app=[your_app]"
हेल्प

यह रास्ता है। मुझे लगता है कि Django प्रवास और मॉडल का पता लगाने आदि में बेकार है, इसके लिए एक प्रमुख अद्यतन चाहते हैं।
वेस्टर्नगुन

मैंने सभी फ़ाइलों को माइग्रेशन से हटा दिया है और django_migrations से सभी पंक्तियों को हटा दिया है और अब मुझे "django.db.migrations.exception.NodeNotFoundError: माइग्रेशन स्टोरीज़ 0001.इनस्ट्रियल रिस्पॉन्सिबिलिटीज़ रेफरेंसेंट पेरेंट नोड '(' स्रोत ',' 0002_auto_201803903243) मिल रहा है। पलायन।
brainLoop

1
यह भी सुनिश्चित करें कि आप __init__.py माइग्रेशन से नहीं हटाते हैं , या, आप इसे बाद में पुनर्स्थापित करते हैं, अन्यथा makemigrations stackoverflow.com/a/46362750/1649917
nmu

python manage.py sqlmigrate name_of_your_app nb_of_the_migrationयह भी आवश्यक है
zar3bski

37

एक विकल्प 'new_field' के लिए एक डिफ़ॉल्ट मान घोषित करना है:

new_field = models.CharField(max_length=140, default='DEFAULT VALUE')

एक अन्य विकल्प 'new_field' को एक अशक्त क्षेत्र घोषित करना है:

new_field = models.CharField(max_length=140, null=True)

यदि आप 'new_field' को एक अशक्त क्षेत्र के रूप में स्वीकार करने का निर्णय लेते हैं, तो आप 'new_field' के लिए मान्य इनपुट के रूप में 'no input' को स्वीकार करना चाहते हैं। फिर आपको blank=Trueस्टेटमेंट भी जोड़ना होगा :

new_field = models.CharField(max_length=140, blank=True, null=True)

यदि आवश्यक हो, तो भी null=Trueऔर / या blank=Trueआप एक डिफ़ॉल्ट मान जोड़ सकते हैं:

new_field = models.CharField(max_length=140, default='DEFAULT VALUE', blank=True, null=True)

7
«स्ट्रिंग-आधारित फ़ील्ड जैसे नल और टेक्स्टफ़िल्ड पर नल के उपयोग से बचें। यदि किसी स्ट्रिंग-आधारित फ़ील्ड में null = True है, तो इसका मतलब है कि उसके पास "बिना डेटा" के दो संभावित मान हैं: NULL, और खाली स्ट्रिंग। » - मॉडल क्षेत्र संदर्भ
Chema

7

यदि आप विकास चक्र के शुरुआती दौर में हैं, तो आप यह कोशिश कर सकते हैं -

उस मॉडल और उसके सभी उपयोगों को निकालें / टिप्पणी करें। माइग्रेशन लागू करें। यह उस मॉडल को हटा देगा और फिर मॉडल को फिर से जोड़ देगा, माइग्रेशन चलाएगा और आपके पास एक साफ मॉडल होगा जिसमें नया फ़ील्ड जोड़ा जाएगा।


और माइग्रेशन टेबल django_migrations को यहां बताए अनुसार साफ करें: stackoverflow.com/questions/26185687/… या बस GUI का उपयोग करें और आवश्यक पंक्तियों को हटा दें।
रसिया

5

यदि कोई व्यक्ति सेटिंग कर रहा है ForeignKey, तो आप बिना डिफ़ॉल्ट सेट किए केवल अशक्त फ़ील्ड की अनुमति दे सकते हैं:

new_field = models.ForeignKey(model, null=True)

यदि आपके पास पहले से ही डेटाबेस में डेटा संग्रहीत है, तो आप एक डिफ़ॉल्ट मान भी सेट कर सकते हैं:

new_field = models.ForeignKey(model, default=<existing model id here>)

4

यदि "वेबसाइट" खाली हो सकती है, तो खाली new_fieldहोने के लिए भी सेट होना चाहिए।

अब यदि आप सहेजने के लिए तर्क जोड़ना चाहते हैं, जहां new_field"वेबसाइट" से मूल्य हड़पने के लिए खाली है, तो आपको केवल Modelइस तरह से अपने फ़ंक्शन को बचाने की ज़रूरत है :

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    website = models.URLField(blank=True, default='DEFAULT VALUE')
    new_field = models.CharField(max_length=140, blank=True, default='DEFAULT VALUE')

    def save(self, *args, **kwargs):
        if not self.new_field:
            # Setting the value of new_field with website's value
            self.new_field = self.website

        # Saving the object with the default save() function
        super(UserProfile, self).save(*args, **kwargs)

3

आप उस तालिका का संदर्भ नहीं जोड़ सकते हैं जिसमें पहले से ही डेटा है।
परिवर्तन:

user = models.OneToOneField(User)

सेवा:

user = models.OneToOneField(User, default = "")

करना:

python manage.py makemigrations
python manage.py migrate

फिर से बदलें:

user = models.OneToOneField(User)

फिर से प्रवास करें:

python manage.py makemigrations
python manage.py migrate

2

New_file में बूलियन प्रॉपर्टी null जोड़ें।

new_field = models.CharField(max_length=140, null=True)

आपके द्वारा ./manage.py syncdbDB को ताज़ा करने के लिए चलाने के बाद । और अंत में आप चलाते हैं ./manage.py makemigrations और./manage.py migrate



2

क्या आपके पास पहले से ही तालिका में डेटाबेस प्रविष्टियां हैं UserProfile? यदि ऐसा है, तो जब आप नए कॉलम जोड़ते हैं तो डीबी को यह पता नहीं होता है कि इसे क्या सेट करना है क्योंकि यह नहीं हो सकता है NULL। इसलिए यह आपसे पूछता है कि आप उन फ़ील्ड को कॉलम में सेट करना चाहते हैं new_fields। मुझे समस्या को हल करने के लिए इस तालिका से सभी पंक्तियों को हटाना पड़ा ।

(मुझे पता है कि यह कुछ समय पहले उत्तर दिया गया था, लेकिन मैं सिर्फ इस समस्या में भाग गया और यह मेरा समाधान था। उम्मीद है कि यह किसी को भी नया देखने में मदद करेगा)


1
मैंने तालिका में पंक्तियाँ नहीं डाली हैं और अभी भी यह प्राप्त करता है। मुझे मॉडल बदलने के लिए सभी माइग्रेशन हिस्ट्री, क्लियर माइग्रेशन टेबल को डिलीट करना होगा, जैसा कि टॉमस ने सुझाया था।
वेस्टर्नगुन

1

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


1

यदि आप प्रश्न में मॉडल की तालिका को छोटा करने के साथ ठीक हैं, तो आप Noneप्रॉम्प्ट में एक-बंद डिफ़ॉल्ट मान निर्दिष्ट कर सकते हैं । default=Noneआपके कोड में कोई डिफ़ॉल्ट नहीं है, जबकि माइग्रेशन सतही होगा । यह सिर्फ ठीक से लागू किया जा सकता है क्योंकि तालिका में अब कोई डेटा नहीं है जिसके लिए डिफ़ॉल्ट की आवश्यकता होगी।


1

मैं अपने विकास चक्र में जल्दी था, इसलिए यह हर किसी के लिए काम नहीं कर सकता (लेकिन मैं यह नहीं देखता कि यह क्यों नहीं होगा)।

मैंने blank=True, null=Trueउन स्तंभों में जोड़ा जहां मुझे त्रुटि मिल रही थी। फिर मैंने python manage.py makemigrationsकमान चलाई ।

इस कमांड को चलाने के तुरंत बाद (और चलाने से पहले) python manage.py migrate ), मैंने blank=True, null=Trueसभी कॉलम से हटा दिया । फिर मैं python manage.py makemigrationsफिर से भागा । मुझे केवल कॉलम बदलने का विकल्प दिया गया था, जिसे मैंने चुना था।

फिर मैं भाग गया python manage.py migrateऔर सब कुछ अच्छी तरह से काम किया!


0

Django वास्तव में क्या कहता है:

उपयोगकर्ताप्रतिनिधि तालिका में डेटा है और ऐसे new_fieldमान हो सकते हैं जो अशक्त हों, लेकिन मुझे नहीं पता, इसलिए क्या आप सुनिश्चित हैं कि आप संपत्ति को गैर-अशक्त के रूप में चिह्नित करना चाहते हैं, क्योंकि यदि आप करते हैं तो NULL के साथ मान होने पर आपको त्रुटि मिल सकती है

यदि आप सुनिश्चित हैं कि मूल्यों में से कोई भी नहीं userprofile तालिका NULL नहीं है - स्वतंत्र रूप से गिर गया और चेतावनी को अनदेखा कर दिया।

इस तरह के मामलों में सबसे अच्छा अभ्यास खाली मानों को संभालने के लिए रनपाइथन माइग्रेशन बनाना होगा जैसा कि विकल्प 2 में बताया गया है

2) अभी के लिए ध्यान न दें, और मुझे NULL के साथ मौजूदा पंक्तियों को संभालने दें (उदाहरण के लिए क्योंकि आपने पिछले डेटा माइग्रेशन में NULL मानों को संभालने के लिए RunPython या RunSQL ऑपरेशन जोड़ा है)

RunPython माइग्रेशन में आपको सभी मानों UserProfileको खाली new_fieldमान के साथ ढूंढना है और वहां एक सही मान (या डिफ़ॉल्ट मान के रूप में Django आपको मॉडल में सेट करने के लिए कहता है)। आपको कुछ इस तरह मिलेगा:

# please keep in mind that new_value can be an empty string. You decide whether it is a correct value.
for profile in UserProfile.objects.filter(new_value__isnull=True).iterator():
    profile.new_value = calculate_value(profile)
    profile.save() # better to use batch save

मज़े करो!


मुझे यह पता नहीं लग सकता है कि यह दस्तावेज में कहाँ लिखा गया है। क्या आप कृपया लिंक पोस्ट कर सकते हैं
कोडी

0

Model.py में

class UserProfile(models.Model): user = models.OneToOneField(User) website = models.URLField(blank=True) new_field = models.CharField(max_length=140, default="some_value")

आपको डिफ़ॉल्ट के रूप में कुछ मान जोड़ने होंगे।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.