टाइप टाइप हो रही है: __init __ () में 1 आवश्यक स्थिति संबंधी तर्क गायब है: 'on_delete' जब प्रविष्टियों के साथ बच्चे की तालिका के बाद मूल तालिका जोड़ने की कोशिश कर रहा है


90

मेरे साइक्लाइट डेटाबेस में दो वर्ग हैं, एक अभिभावक तालिका नाम Categorieऔर एक बच्चा तालिका है Article। मैंने पहली बार चाइल्ड टेबल क्लास बनाई और प्रविष्टियाँ जोड़ीं। तो पहले मेरे पास यह था:

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'

मैंने स्टैकओवरफ्लो में कुछ समान मुद्दों को देखा है, लेकिन यह एक ही समस्या नहीं है: __in __ () 1 आवश्यक स्थिति तर्क को याद कर रहा है: 'मात्रा'


3
आप क्या उपयोग कर रहे हैं?
alfonso.kim

1
तो आप यहाँ किस उलझन में हैं? जैसा कि त्रुटि स्पष्ट रूप से कहती है, फॉरेनके के पास एक आवश्यक तर्क है on_delete,। डॉक्स देखें ।
डैनियल रोसमैन

मुझे on_deleteपैरामीटर की आवश्यकता नहीं है , क्या यह अनिवार्य है?
क्रिश्चियन लिसांगोला

@ jochri3 हां, आवश्यक स्थिति तर्क का मतलब है कि यह अनिवार्य है। यह पता लगाने के लिए कि कौन सा विकल्प आपकी आवश्यकताओं के लिए सबसे उपयुक्त होगा, दस्तावेज की जाँच करें।
सीज़र

जवाबों:


165

आप 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,
# ...

on_delete = model.CASCADE Django <2
पीटर एफ


11

Django 2.0 on_deleteसे आवश्यक है:

उपयोगकर्ता = मॉडल ।neToOneField (उपयोगकर्ता, on_delete = model.CASCADE)

यदि उपयोगकर्ता हटा दिया जाता है तो यह चाइल्ड टेबल डेटा को हटा देगा। अधिक जानकारी के लिए Django प्रलेखन की जाँच करें।


1
इस जानकारी के साथ एंड्री की प्रतिक्रिया से पहले इसका जवाब क्यों?
सैमुअल Dauzon

11

Django 2.0 के बाद से ForeignKey फ़ील्ड को दो स्थैतिक तर्क की आवश्यकता है:

  1. करने के लिए नक्शा करने के लिए मॉडल
  2. on_delete तर्क
categorie = models.ForeignKey('Categorie', on_delete=models.PROTECT)

यहाँ कुछ तरीके on_delete में उपयोग किए जा सकते हैं

  1. CASCADE

कैस्केड हटाता है। Django ने SQL कसौटी पर DELETE CASCADE के व्यवहार का अनुकरण किया और फॉरेनके युक्त ऑब्जेक्ट को भी हटा दिया

  1. रक्षा करना

संरक्षित ऑब्जेक्ट को django.db.IntegrityError के उपवर्ग द्वारा संरक्षित ऑब्जेक्ट को हटाने से रोकें।

  1. कुछ मत करो

कोई कदम मत उठाना। यदि आपका डेटाबेस रेफ़रेंशियल इंटिग्रिटी लागू करता है, तो यह तब तक एक इंटीग्रिटी ईसर का कारण बनेगा, जब तक कि आप डेटाबेस फ़ील्ड में SQL ON DELETE बाधा को मैन्युअल रूप से नहीं जोड़ते।

आप पढ़ कर on_delete के बारे में अधिक प्राप्त कर सकते हैं प्रलेखन


4

यदि आप विदेशी का उपयोग कर रहे हैं तो आपको "on_delete = model.CASCADE" का उपयोग करना होगा क्योंकि यह मूल तत्व को मूल तालिका से हटाने के बाद विकसित जटिलता को समाप्त कर देगा। इतना सरल है।

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

3

यहां उपलब्ध विकल्प हैं यदि यह on_delete के लिए किसी की मदद करता है

कैस्केड, DO_NOTHING, PROTECT, SET, SET_DEFAULT, SET_NULL


1

Django संस्करण 1.9, on_deleteएक आवश्यक तर्क बन गया, अर्थात Django 2.0 से।

पुराने संस्करणों में, यह CASCADE में चूक करता है।

इसलिए, यदि आप पहले के संस्करणों में उपयोग की गई कार्यक्षमता को दोहराना चाहते हैं। निम्न तर्क का उपयोग करें।

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

इसका वही प्रभाव होगा जो पहले के संस्करणों में था , इसे स्पष्ट रूप से निर्दिष्ट किए बिना।

अन्य दलीलों पर आधिकारिक दस्तावेज जो on_delete के साथ चलते हैं


0

यदि आप नहीं जानते कि कौन से विकल्प में प्रवेश के लिए विकल्प है। बस on_delete=Noneमाइग्रेशन से पहले डिफ़ॉल्ट मान रखना चाहते हैं :

on_delete = models.CASCADE

यह पुराने संस्करण में एक कोड स्निपेट है:

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

इसी तरह की समस्या थी जो इन दोनों मापदंडों को जोड़कर ForeignKey को हल करती है: null = True, on_delete = model.SETALULL


-3

इसने मेरे लिए काम किया pip install django-csvimport --upgrade


2
यह प्रश्न का उत्तर कैसे देता है?
सीज़र

हाय मयंक। आपने शायद उस त्रुटि को ठीक करने के लिए कुछ और किया है या आप django के पुराने संस्करण का उपयोग कर रहे हैं।
क्रिस डेयर

यह "on_delete" मॉडल के लिए तर्क के लिए एक मूल्य प्रदान करके हल किया गया है। ForeignKey
क्रिस डेयर

आप संस्करण 2 से पहले Django का उपयोग कर रहे हैं। क्योंकि बाद के सभी रिलीज ने on_deleteएक मजबूरी बना दी है! पहले के संस्करणों में डिफ़ॉल्ट रूप से, यह थाon_delete = models.CASCADE
ऑप्टिडर जूल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.