【问题标题】:NameError in Django model? Why Cant I reference something within a model?Django模型中的NameError?为什么我不能在模型中引用某些东西?
【发布时间】:2013-03-25 17:33:51
【问题描述】:

由于某种原因,我无法让这个模型彼此建立任何关系?而 Aptana 给了我红线和错误,说 Test1 和 Test2 是未定义的变量...起初我认为它只是 aptana 搞砸了所以我决定同步它,但它实际上给了我错误说 NameError: name Test1 is not defined?可能是什么原因?提前致谢!

from django.db import models
from django.contrib.auth.models import User
from django.utils.translation import ugettext as _
from userena.models import UserenaBaseProfile

class MyProfile(UserenaBaseProfile):
    user = models.OneToOneField(User, unique=True, verbose_name=_('User'), related_name='my_profile')
    favourite_snack = models.CharField(_('favourite snack'), max_length=5)
    test1 = models.ManyToManyField(Test1)

class Test1(models.Model):
    name = models.CharField(max_length=255, blank=False)
    test2 = models.OneToOneField(Test2)

class Test2(models.Model):
    name = models.CharField()

【问题讨论】:

    标签: django django-models python-2.7


    【解决方案1】:

    这是定义类的顺序。 Python 解释器不进行正向查找 这应该可以解决您的问题。

    from django.db import models
    from django.contrib.auth.models import User
    from django.utils.translation import ugettext as _
    from userena.models import UserenaBaseProfile
    
    class Test2(models.Model):
        name = models.CharField()
    
    class Test1(models.Model):
        name = models.CharField(max_length=255, blank=False)
        test2 = models.OneToOneField(Test2)
    
    class MyProfile(UserenaBaseProfile):
        user = models.OneToOneField(User, unique=True, verbose_name=_('User'), related_name='my_profile')
        favourite_snack = models.CharField(_('favourite snack'), max_length=5)
        test1 = models.ManyToManyField(Test1)
    

    【讨论】:

    • 这很简单...谢谢!但是现在涉及到我的下一个问题..为什么以下工作? from django.db import models class T1(models.Model): t2 = models.ForeignKey(T2) class T2(models.Model): t1 = models.ForeignKey(T1)
    • python 是一种解释型语言,解释器是一行一行的。到 test1 被引用时,它还没有进行前向查找的能力。因此抛出错误
    【解决方案2】:

    您在实际创建模型之前引用了模型,这就是为什么您遇到 undefined 错误,使用模型名称作为字符串而不是实际模型:

    models.OneToOneField('Test2')
    

    here所述:

    如果需要在尚未定义的模型上创建关系,可以使用模型的名称,而不是模型对象本身

    其他方法是根据提到的karthikr 引用的顺序对文件中的模型重新排序。

    【讨论】:

    • 我想在您的答案中添加一个,因为我不能同时接受这两个答案,但是由于我是新人,所以没有声誉甚至不能投票...
    • @user2242246 完全没有问题。重要的是它帮助了你。
    猜你喜欢
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    相关资源
    最近更新 更多