मेरे पास ये दो मॉडल हैं:

class User(AbstractUser):
    pass



class Listing(models.Model):
    listing_id = models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')
    title = models.CharField(max_length=64)
    owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="listing")

मैं उपयोगकर्ता मॉडल में निम्नलिखित करना चाहता हूं:

class User(AbstractUser):
    listing = models.ForeignKey(Listing, on_delete=models.CASCADE)

लेकिन मुझे निम्न त्रुटि मिल रही है: NameError: name 'Listing' is not defined

क्या अमूर्त उपयोगकर्ता के लिए एक विदेशी कुंजी जोड़ना संभव है?

1
user13788524 29 जुलाई 2020, 00:39

2 जवाब

सबसे बढ़िया उत्तर

चूंकि आपने User पहले Listing को परिभाषित किया है, इसलिए नाम अभी तक परिभाषित नहीं है। हालांकि यह Django के लिए कोई समस्या नहीं है क्योंकि आप स्ट्रिंग अक्षर का भी उपयोग कर सकते हैं:

class User(AbstractUser):
    listing = models.ForeignKey('Listing', on_delete=models.CASCADE)

class Listing(models.Model):
    listing_id = models.AutoField(
        auto_created=True,
        primary_key=True,
        serialize=False,
        verbose_name='ID'
    )
    title = models.CharField(max_length=64)
    owner = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='listing'
    )

हालांकि आप यहां listing नाम के साथ ForeignKey को परिभाषित नहीं कर सकते, क्योंकि आपके Listing मॉडल में related_name='listing' के साथ पहले से ही एक ForeignKey है। इस प्रकार यह एक त्रुटि का परिणाम होगा। इस प्रकार आपको या तो related_name को बदलना चाहिए, या listing का नाम User मॉडल में बदलना चाहिए।

1
Willem Van Onsem 29 जुलाई 2020, 00:42

उन मुद्दों से बचने के लिए मॉडल नाम को एक स्ट्रिंग के रूप में पास करें जहाँ आप एक ऐसे मॉडल का संदर्भ देना चाहते हैं जो अभी तक परिभाषित नहीं है

class User(AbstractUser):
    listing = models.ForeignKey('Listing', on_delete=models.CASCADE)

आप ऐप नाम जोड़कर किसी अन्य ऐप में किसी मॉडल को संदर्भित करने के लिए उसी विधि का उपयोग कर सकते हैं

listing = models.ForeignKey('app.Listing', on_delete=models.CASCADE)
1
Iain Shelvington 29 जुलाई 2020, 00:41