আপনি কোনও ডিফল্ট ছাড়াই ব্যবহারকারীর প্রোফাইলে একটি 'নন-ফিল্ড ফিল্ড' নতুন_ফিল্ড 'যুক্ত করার চেষ্টা করছেন


108

আমি জানি যে জাঙ্গো ১.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
আমি যুক্ত করতে চেয়েছিলাম যে আপনি যখন বিদ্যমান টেবিলটি পরিবর্তন করছেন তখনই সমস্যাটি ঘটে যখন আপনি কোনও নতুন তৈরি করার সময় নয়।
এক্স-ইউরি

উত্তর:


91

আপনাকে একটি ডিফল্ট মান প্রদান করতে হবে:

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

আমার যদি নিউ ফিল্ডের একটি ওয়েবসাইট ক্ষেত্রের একটি অনুলিপি থাকা দরকার। কিভাবে দেখতে হবে? default = websiteকাজটি করে না
ইরমান্তাস ionেলিওনিস

7
আপনি প্রথমে বোগাস ডিফল্ট মান দিয়ে মাইগ্রেশন করতে চান, তারপরে প্রতিটি রেকর্ডের মাধ্যমে পুনরাবৃত্তি করতে ডেটা মাইগ্রেশন তৈরি করতে এবং সেট new_fieldকরতে চান website
dgel 21

ডিফল্টটি চারফিল্ডের জন্য alচ্ছিক হওয়া উচিত
ফ্লোরেন্ট

87

আপনি যদি প্রাথমিক বিকাশের চক্রের মধ্যে থাকেন এবং আপনার বর্তমান ডাটাবেস ডেটার বিষয়ে যত্নশীল না হন তবে আপনি কেবল এটি সরাতে পারেন এবং তারপরে স্থানান্তর করতে পারেন। তবে প্রথমে আপনাকে মাইগ্রেশন দির পরিষ্কার করতে হবে এবং এর সারিগুলি সারণী থেকে সরিয়ে ফেলতে হবে (জাজানো_ইমিগ্রেশন)

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.db.migration.exferences.NodeNotFoundError: মাইগ্রেশন গল্পগুলি। 10001_সামান্য নির্ভরশীলতা রেফারেন্স অস্তিত্বহীন প্যারেন্ট নোড ('উত্স', '0002_auto_20180903_1224') চলাকালীন" মাইগ্রেশন।
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 = models.CharField(max_length=140, default='DEFAULT VALUE')

আরেকটি বিকল্প হ'ল 'নিউ_ফিল্ড' কে একটি নালযোগ্য ক্ষেত্র হিসাবে ঘোষণা করা:

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

যদি আপনি 'নিউ_ফিল্ড' কে একটি নালযোগ্য ক্ষেত্র হিসাবে গ্রহণ করার সিদ্ধান্ত নেন তবে আপনি 'নিউ_ফিল্ড' এর বৈধ ইনপুট হিসাবে 'নো ইনপুট' গ্রহণ করতে চাইতে পারেন। তারপরে আপনাকে 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
String স্ট্রিং-ভিত্তিক ক্ষেত্র যেমন চারফিল্ড এবং টেক্সটফিল্ডে নাল ব্যবহার করা থেকে বিরত থাকুন। যদি স্ট্রিং-ভিত্তিক ক্ষেত্রটির শূন্য = সত্য হয়, এর অর্থ এটি "কোনও ডেটা নেই" এর জন্য দুটি সম্ভাব্য মান রয়েছে: নুল এবং খালি স্ট্রিং » - মডেল ক্ষেত্রের রেফারেন্স
6:47

7

আপনি যদি বিকাশের চক্রের প্রথম দিকে থাকেন তবে আপনি এটি চেষ্টা করতে পারেন -

মডেল এবং এর সমস্ত ব্যবহারগুলি সরিয়ে / মন্তব্য করুন। মাইগ্রেশন প্রয়োগ করুন। এটি সেই মডেলটিকে মুছবে এবং তারপরে আবার মডেল যুক্ত করবে, মাইগ্রেশন চালাবে এবং নতুন ক্ষেত্র যুক্ত হওয়ার সাথে আপনার একটি পরিষ্কার মডেল থাকবে have


এবং হিসাবে পরিষ্কার আপ মাইগ্রেশন টেবিল django_migrations এখানে দেওয়া: stackoverflow.com/questions/26185687/... অথবা শুধু প্রয়োজনীয় সারি একটি GUI ব্যবহার এবং মুছে দিন।
RusI

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)

4

যদি কেউ একটি সেট করে ForeignKeyচলেছে তবে আপনি কেবলমাত্র ডিফল্ট সেট না করেই অযোগ্য ক্ষেত্রগুলিতে অনুমতি দিতে পারবেন:

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

আপনার যদি ইতিমধ্যে ডাটাবেসের মধ্যে ডেটা সঞ্চিত থাকে তবে আপনি একটি ডিফল্ট মানও সেট করতে পারেন:

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

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 এ বুলিয়ান সম্পত্তি নাল যুক্ত করুন।

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

আপনি ./manage.py syncdbডিবি রিফ্রেশ জন্য একটি চালানোর পরে । এবং অবশেষে আপনি চালান ./manage.py makemigrations এবং./manage.py migrate


2

আপনি এই পৃষ্ঠা থেকে জ্যাঙ্গো ডক থেকে পদ্ধতি ব্যবহার করতে পারেন https://docs.djangoproject.com/en/1.8/ref/models/fields/#default

ডিফল্ট তৈরি করুন এবং এটি ব্যবহার করুন

def contact_default():
   return {"email": "to1@example.com"}

contact_info = JSONField("ContactInfo", default=contact_default)

2

আপনি ইতিমধ্যে টেবিলে ডাটাবেস এন্ট্রি আছে UserProfile? যদি তাই হয়, আপনি যখন নতুন কলাম যুক্ত করবেন তখন ডিবি কী সেট করতে হবে তা জানে না কারণ এটি হতে পারে না NULL। সুতরাং এটি আপনাকে জিজ্ঞাসা করে আপনি কলামে those ক্ষেত্রগুলি কী সেট করতে চান new_fields। সমস্যাটি সমাধান করার জন্য আমাকে এই টেবিল থেকে সমস্ত সারি মুছে ফেলতে হয়েছিল ।

(আমি জানি কিছু দিন আগে এর উত্তর দেওয়া হয়েছিল, তবে আমি কেবল এই সমস্যার মধ্যে পড়েছিলাম এবং এটি আমার সমাধান ছিল Hope আশা করি এটি নতুন কাউকে এটি দেখতে সহায়তা করবে)


1
আমি টেবিলের মধ্যে সারিগুলি প্রবেশ করিনি এবং এখনও এটি পেয়েছি। টমাসজ পরামর্শ অনুযায়ী আমাকে সমস্ত মাইগ্রেশন ইতিহাস মুছে ফেলতে হবে, মডেলটি পরিবর্তন করতে মাইগ্রেশন টেবিল সাফ করুন।
ওয়েস্টার্নগুন

1

আমি সত্যই এটির কাছাকাছি যাওয়ার সর্বোত্তম উপায়টি হ'ল কেবল আপনার প্রয়োজনীয় ক্ষেত্রগুলির সাথে অন্য একটি মডেল তৈরি করা এবং নামটি কিছুটা পৃথক করা। স্থানান্তর চালান। অব্যবহৃত মডেলটি মুছুন এবং আবার মাইগ্রেশন চালান। Voila।


1

যদি আপনি প্রশ্নে থাকা মডেলের টেবিলটি কেটে ফেলতে ঠিক থাকেন তবে আপনি Noneপ্রম্পটে একটি অফ অফ ডিফল্ট মান নির্দিষ্ট করতে পারবেন । default=Noneআপনার কোডটির কোনও ডিফল্ট না থাকলে মাইগ্রেশনটির অতিরিক্ত প্রয়োজন হবে । এটি ঠিকঠাক প্রয়োগ করা যেতে পারে কারণ টেবিলে আর কোনও ডেটা নেই যা ডিফল্টর প্রয়োজন হয় require


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

জ্যাঙ্গো আসলে যা বলে তা হ'ল:

ব্যবহারকারীর প্রোফাইলে সারণিতে এতে ডেটা রয়েছে এবং new_fieldমানগুলি নালাগুলি থাকতে পারে তবে আমি জানি না, তাই আপনি কি নিশ্চিত যে সম্পত্তিটি অযোগ্য হিসাবে চিহ্নিত করতে চান, কারণ যদি আপনি নাল সাথে মান থাকে তবে আপনি একটি ত্রুটি পেতে পারেন

আপনি যদি নিশ্চিত হন যে userprofileটেবিলের কোনও মানই নাল নয় - মুক্ত হয়ে পড়ে এবং সতর্কতাটিকে উপেক্ষা করে।

এই জাতীয় ক্ষেত্রে সর্বোত্তম অনুশীলন হ'ল খালি মানগুলি হ্যান্ডেল করার জন্য একটি রানপিথন মাইগ্রেশন তৈরি করা হবে যেমন এটি বিকল্প 2-এ বর্ণিত

২) আপাতত উপেক্ষা করুন এবং আমাকে নিজেই NULL এর সাহায্যে বিদ্যমান সারিগুলি পরিচালনা করতে দিন (উদাহরণস্বরূপ, কারণ আপনি আগের ডেটা মাইগ্রেশনে নুল মানগুলি হ্যান্ডেল করতে একটি রানপাইথন বা রানসকিউএল অপারেশন যুক্ত করেছেন)

রানপিথন মাইগ্রেশনে আপনাকে UserProfileখালি new_fieldমান সহ সমস্ত দৃষ্টান্ত সন্ধান করতে হবে এবং সেখানে একটি সঠিক মান স্থাপন করতে হবে (বা জ্যাঙ্গো আপনাকে মডেলটিতে সেট করতে বলার মতো একটি ডিফল্ট মান)। আপনি এরকম কিছু পাবেন:

# 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

মডেল.পি

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

আপনাকে ডিফল্ট হিসাবে কিছু মান যুক্ত করতে হবে।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.