প্রকারের ত্রুটিটি পাওয়া: __init __ () 1 টি প্রয়োজনীয় অবস্থানগত আর্গুমেন্ট অনুপস্থিত: 'অন_ডিলিট' এন্ট্রি সহ শিশু টেবিলের পরে পিতামাতার টেবিলটি যুক্ত করার চেষ্টা করার সময়


92

আমার স্ক্লাইট ডাটাবেসে আমার দুটি ক্লাস রয়েছে, একটি পিতামাতার টেবিলের নাম Categorieএবং চাইল্ড টেবিল কল Article। আমি প্রথমে চাইল্ড টেবিল ক্লাস এবং এন্ট্রি যুক্ত করেছি es সুতরাং প্রথম আমার এটি ছিল:

class Article(models.Model):
    titre=models.CharField(max_length=100)
    auteur=models.CharField(max_length=42)
    contenu=models.TextField(null=True)
    date=models.DateTimeField(
        auto_now_add=True,
        auto_now=False,
        verbose_name="Date de parution"
    )

    def __str__(self):
        return self.titre

এবং আমি পিতামাতা সারণী যুক্ত করার পরে এবং এখন আমার models.pyচেহারাটি এর মতো:

from django.db import models

# Create your models here.
class Categorie(models.Model):
    nom = models.CharField(max_length=30)

    def __str__(self):
        return self.nom


class Article(models.Model):
    titre=models.CharField(max_length=100)
    auteur=models.CharField(max_length=42)
    contenu=models.TextField(null=True)
    date=models.DateTimeField(
        auto_now_add=True,
        auto_now=False,
        verbose_name="Date de parution"
    )
    categorie = models.ForeignKey('Categorie')

    def __str__(self):
        return self.titre

সুতরাং আমি যখন চালাচ্ছি python manage.py makemigrations <my_app_name>, আমি এই ত্রুটিটি পেয়েছি:

Traceback (most recent call last):
  File "manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django-2.0-py3.5.egg\django\core\management\__init__.py", line 354, in execute_from_command_line
    utility.execute()
  File "C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django-2.0-py3.5.egg\django\core\management\__init__.py", line 330, in execute
    django.setup()
  File "C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django-2.0-py3.5.egg\django\__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django-2.0-py3.5.egg\django\apps\registry.py", line 112, in populate
    app_config.import_models()
  File "C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django-2.0-py3.5.egg\django\apps\config.py", line 198, in import_models
    self.models_module = import_module(models_module_name)
  File "C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 665, in exec_module
  File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
  File "C:\Users\lislis\Django\mon_site\blog\models.py", line 6, in <module>
    class Article(models.Model):
  File "C:\Users\lislis\Django\mon_site\blog\models.py", line 16, in Article
    categorie = models.ForeignKey('Categorie')
TypeError: __init__() missing 1 required positional argument: 'on_delete'

আমি স্ট্যাকওভারফ্লোতে অনুরূপ কিছু সমস্যা দেখেছি, তবে এটি একই সমস্যা বলে মনে হচ্ছে না: __init __ () 1 প্রয়োজনীয় অবস্থানগত আর্গুমেন্ট: 'পরিমাণ'


4
জ্যাঙ্গোর কোন সংস্করণ আপনি ব্যবহার করছেন?
alfonso.kim

4
তাহলে আপনি এখানে কি সম্পর্কে বিভ্রান্ত? ত্রুটিটি স্পষ্টতই বলেছে, ফরেনকে-র একটি প্রয়োজনীয় যুক্তি রয়েছে on_delete,। দস্তাবেজগুলি দেখুন ।
ড্যানিয়েল রোজম্যান 13

আমার on_deleteপ্যারামিটার দরকার নেই , এটা কি বাধ্যতামূলক?
খ্রিস্টান লিসাঙ্গোলা

@ জোছরি 3 হ্যাঁ, প্রয়োজনীয় অবস্থানগত যুক্তির অর্থ এটি বাধ্যতামূলক। কোন বিকল্পটি আপনার প্রয়োজনের সাথে সবচেয়ে উপযুক্ত হবে তা জানতে ডকুমেন্টেশন পরীক্ষা করুন।
cezar

উত্তর:


168

আপনি categorieশ্রেণীর সম্পত্তি এর Articleমতো পরিবর্তন করতে পারেন :

categorie = models.ForeignKey(
    'Categorie',
    on_delete=models.CASCADE,
)

এবং ত্রুটি অদৃশ্য হওয়া উচিত।

অবশেষে আপনার জন্য অন্য বিকল্পের প্রয়োজন হতে পারে on_delete, আরও বিশদ জন্য ডকুমেন্টেশন চেক করুন:

https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.ForeignKey

সম্পাদনা:

আপনি আপনার মন্তব্যে যেমন বলেছেন যে আপনার কোনও বিশেষ প্রয়োজনীয়তা নেই on_delete, আপনি এই বিকল্পটি ব্যবহার করতে পারেন DO_NOTHING:

# ...
on_delete=models.DO_NOTHING,
# ...

4
অন_ডিলিট = মডেলস AS ক্যাসক্যাডে জ্যাঙ্গো <2
পিটার এফ

46

যেহেতু জাজানো 2.x, on_deleteপ্রয়োজনীয় is

জ্যাঙ্গো ডকুমেন্টেশন

সংস্করণ ১.৯ থেকে অবহেলিত: অন_ডিলিট জাজানো ২.০ এ একটি প্রয়োজনীয় যুক্তি হয়ে উঠবে। পুরানো সংস্করণগুলিতে এটি ক্যাসকেডে ডিফল্ট।


11

জ্যাঙ্গো 2.0 থেকে on_deleteপ্রয়োজনীয়:

ব্যবহারকারী = মডেল.অনোটো ওনফিল্ড (ব্যবহারকারী, অন_ডিলিট = মডেল.ক্যাসক্যাড)

এটি ব্যবহারকারী মুছে ফেলা হলে চাইল্ড টেবিলের ডেটা মুছে ফেলবে। আরও তথ্যের জন্য জ্যাঙ্গো ডকুমেন্টেশন চেক করুন।


4
অ্যান্ড্রে এই তথ্যের সাথে প্রতিক্রিয়া জানাতে গিয়ে কেন এই উত্তর?
স্যামুয়েল ডাজন

11

জ্যাঙ্গো ২.০ যেহেতু ফরেনকি ক্ষেত্রের জন্য দুটি স্থিতি যুক্তি প্রয়োজন:

  1. মডেল থেকে মানচিত্র
  2. on_delete আর্গুমেন্ট
categorie = models.ForeignKey('Categorie', on_delete=models.PROTECT)

অন_ডিলিটে এখানে কিছু পদ্ধতি ব্যবহার করা যেতে পারে

  1. ক্যাসকেড

ক্যাসকেড মোছা। জাজানো এসকিউএল সীমাবদ্ধতার আচরণটি এমসেট করে ক্যাসকেড মুছে ফেলুন এবং বিদেশী কী সহ থাকা বস্তুটিও মুছে ফেলে

  1. সুরক্ষা

জ্যাঙ্গো.ডিবি.ইন্টিগ্রিটিএররের একটি সাবক্লাস প্রোটেক্টেড এরির উত্থাপন করে রেফারেন্স করা অবজেক্টটি মুছতে বাধা দিন।

  1. কিছু করনা

কোন পদক্ষেপ নিও না. যদি আপনার ডাটাবেস ব্যাকএন্ডটি রেফারেনশিয়াল অখণ্ডতা প্রয়োগ করে, আপনি যদি ডেটাবেস ক্ষেত্রে ম্যানুয়ালি একটি এসকিউএল মুছে ফেলার জন্য সীমাবদ্ধতা না যোগ করেন তবে এটি একটি ইন্টিগ্রিটিআরারের কারণ হয়ে দাঁড়ায়।

আপনি ডকুমেন্টেশন পড়ে অন_ডিলিট সম্পর্কে আরও জানতে পারেন ।


4

আপনি যদি বিদেশি ব্যবহার করে থাকেন তবে আপনাকে "on_delete = মডেলস.ক্যাসক্যাডে" ব্যবহার করতে হবে কারণ এটি পিতৃ সারণী থেকে মূল উপাদানটি মুছার পরে তৈরি জটিলতা দূর করবে। এর মত সহজ.

categorie = models.ForeignKey('Categorie', on_delete=models.CASCADE)

3

এটি যদি অন_ডিলিটের জন্য কাউকে সহায়তা করে তবে এখানে উপলভ্য বিকল্পগুলি রয়েছে

ক্যাসকেড, ডিও_ওথিং, সুরক্ষা, SET, SET_DEFAULT, SET_NULL


1

জাজানো পরবর্তী সংস্করণ ১.৯, on_deleteএকটি প্রয়োজনীয় আর্গুমেন্টে পরিণত হয়েছিল, অর্থাত জাজানো ২.০ থেকে।

পুরানো সংস্করণগুলিতে এটি ক্যাসকেডে ডিফল্ট হয়।

সুতরাং, আপনি যদি পূর্ববর্তী সংস্করণগুলিতে যে কার্যকারিতাটি ব্যবহার করেছিলেন তার প্রতিলিপি করতে চান। নিম্নলিখিত যুক্তি ব্যবহার করুন।

categorie = models.ForeignKey('Categorie', on_delete = models.CASCADE)

এটি পূর্ববর্তী সংস্করণগুলির মতো একই প্রভাব ফেলবে , এটি স্পষ্টভাবে উল্লেখ না করে।

অন_ডিলিটের সাথে চলে যাওয়া অন্যান্য যুক্তিগুলির বিষয়ে অফিসিয়াল ডকুমেন্টেশন


0

প্যারামগুলি প্রবেশ করানোর বিকল্পটি যদি আপনি না জানেন। on_delete=Noneমাইগ্রেশনের আগে যেমন ডিফল্ট মান রাখতে চান :

অন_ডিলেট = মডেল AS ক্যাসকেড

এটি পুরানো সংস্করণে একটি কোড স্নিপেট:

if on_delete is None:
    warnings.warn(
        "on_delete will be a required arg for %s in Django 2.0. Set "
        "it to models.CASCADE on models and in existing migrations "
        "if you want to maintain the current default behavior. "
        "See https://docs.djangoproject.com/en/%s/ref/models/fields/"
        "#django.db.models.ForeignKey.on_delete" % (
            self.__class__.__name__,
            get_docs_version(),
        ),
        RemovedInDjango20Warning, 2)
    on_delete = CASCADE

0

একটি অনুরূপ সমস্যা ছিল যা এই দুটি পরামিতি ফরেনকে-তে যুক্ত করে সমাধান করা হয়েছে: নাল = সত্য, অন_ডিলিট = মডেল SE SET_NULL


-3

এটি আমার পক্ষে কাজ করেছে pip install django-csvimport --upgrade


4
কিভাবে এই প্রশ্নের উত্তর দেয়?
সেজার

হাই মায়াঙ্ক আপনি সম্ভবত ত্রুটিটি সমাধান করতে অন্য কিছু করেছিলেন বা আপনি জ্যাঙ্গোর আগের সংস্করণটি ব্যবহার করছেন।
ক্রিস সাহস

মডেলগুলিতে "অন_ডিলিট" যুক্তির জন্য একটি মান সরবরাহ করে এটি সমাধান করা হয়েছে oreফোরইনকি
ক্রিস ডেয়ার

সংস্করণ 2 এর আগে আপনি জ্যাঙ্গো ব্যবহার করছেন Because কারণ পরবর্তী সমস্ত প্রকাশগুলি on_deleteবাধ্যতামূলক করেছে! পূর্ববর্তী সংস্করণগুলিতে ডিফল্টরূপে, এটি ছিলon_delete = models.CASCADE
16
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.