【问题标题】:NameError: name 'Tag' is not definedNameError:名称“标签”未定义
【发布时间】:2012-12-01 00:46:00
【问题描述】:

我正在为我的 django 站点创建模型(python,如果这不明显的话)。

from django.db import models

class Picture(models.Model):
        name = models.CharField(max_length=100)
        pub_date = models.DateTimeField('date published')
        tags = models.ManyToManyField(Tag)
        owner = models.ForeignKey(User)

class Tag(models.Model):
        pics = models.ManyToManyField(Picture)
        name = models.CharField(max_length=30)

class User(models.Model):
        name = models.CharField(max_length=20)
        date_joined = models.DateTimeField('date joined')

class Comment(models.Model):
        content = models.CharField(max_length=500)
        date = models.DateTimeField('date commented')
        commenter = models.ForeignKey(User)
        pic = models.ForeignKey(Picture)

这是当前的全部模型,但我在 tags = models.ManyToManyField(Tag) 行收到错误消息,提示“NameError: name 'Tag' is not defined”

这是怎么回事?

【问题讨论】:

    标签: python django nameerror


    【解决方案1】:

    你在声明Picture之后声明了Tag,但是Picture使用了Tag,所以在你尝试使用它的时候并没有定义它。只需更改课程的顺序,它应该可以解决问题。

    换句话说,将您的代码更改为:

    class Tag(models.Model):
        pics = models.ManyToManyField(Picture)
        name = models.CharField(max_length=30)
    
    # Hurray, Tag exists now
    
    class Picture(models.Model):
        name = models.CharField(max_length=100)
        pub_date = models.DateTimeField('date published')
    
        # Therefore, this next line will work
    
        tags = models.ManyToManyField(Tag)
        owner = models.ForeignKey(User)
    

    (减去我的 cmets)

    【讨论】:

    • 我明白了...如果这是真的,我还在我的 Tag 类中使用 Picture。如果两者都相互依赖,我该如何解决?
    • 阅读:stackoverflow.com/questions/8466726/…(简短的回答是您可以改为使用models.ManyToManyField('Tag'),因为 Tag 将是一个字符串而不是一个类,它应该可以工作。
    • 漂亮!这似乎奏效了。哈哈,我本来想说“感谢上帝提供脚本语言”,但我想脚本语言首先导致了问题......
    • 嘿,很好看,在 Java 或 C 等静态语言中找到像 Django 一样适应的东西(我不记得 Hibernate 是如何处理这样的事情的,但即使不记得我也很确定它是丑陋的 ;-) )
    猜你喜欢
    • 2020-05-16
    • 2020-06-27
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 2021-04-15
    相关资源
    最近更新 更多