2016-03-03 6 views
6

मेरे models.py फ़ाइल है:Django on_delete = models.CASCADE एसक्यूएल स्तर पर कोई प्रभाव नहीं है

class User(models.Model): 
    email = models.CharField(max_length=100, unique=True) 
    password = models.CharField(max_length=100) 
    create_time = models.DateTimeField(auto_now_add=True) 

class Session(models.Model): 
    user = models.ForeignKey(User, on_delete=models.CASCADE) 
    token = models.CharField(max_length=100, unique=True) 

जब मैं कमांड python manage.py makemigrations और फिर कमान python manage.py sqlmigrate <app_name> <migration_name> मैं कुछ भी है कि कहते हैं नहीं दिख रहा है "पर DELETE = CASCADE"

हालांकि, जब मैं python manage.py migrate टाइप करता हूं तो माइग्रेशन विफलता के बिना काम करता है।

अब, अगर मैं mysql तालिका पर जाएं (SequelPro का प्रयोग करके) और एक उपयोगकर्ता जो वर्तमान में एक सत्र प्रविष्टि है के लिए एक पंक्ति को हटाने का प्रयास, मैं निम्नलिखित त्रुटि मिलती है: पुनः लोड करें "एक पंक्ति नहीं हटाई गई। तालिका सुनिश्चित करें कि इस दौरान सामग्री में बदलाव नहीं आया है। इस तालिका की प्राथमिक कुंजी के अंदर संभावित त्रुटियों के लिए कंसोल की जांच करें! "।

अब, जब मैं सत्र तालिका में जाता हूं और इस उपयोगकर्ता के सत्र हटा देता हूं और फिर उपयोगकर्ता तालिका से उपयोगकर्ता की पंक्ति को हटाने का प्रयास करता हूं, तो यह ठीक से हटा देता है। यह इंगित करता है कि ON DELETE = CASCADE वास्तव में MySQL स्तर पर काम नहीं कर रहा है।

मैं इसे कैसे ठीक कर सकता हूं?

उत्तर

13
docs (जोर मेरा) से

:

ForeignKey.on_delete

When an object referenced by a ForeignKey is deleted, Django will emulate the behavior of the SQL constraint specified by the on_delete argument.

Django वास्तव में डेटाबेस में एक ON DELETE खंड निर्धारित नहीं करता है। यदि आपको एक की आवश्यकता है, तो आप RunSQL ऑपरेशन का उपयोग करके मैन्युअल रूप से एक जोड़ सकते हैं। उसी इंडेक्स नाम का उपयोग करना सुनिश्चित करें, या मूल अनुक्रमणिका रखें, या आप बाद में त्रुटियों में भाग सकते हैं।

+7

जो कि एक बमर है :( –

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