【问题标题】:Python NameError (Django)Python 名称错误 (Django)
【发布时间】:2012-09-22 17:35:15
【问题描述】:

这是models.py中的代码

class Package(models.Model):
  name=models.CharField(max_length=300)
  version=models.CharField(max_length=300,blank=True)
  home_page=models.URLField(blank=True)
  summary=models.TextField()
  description=models.TextField(blank=True)
  keywords=models.TextField(blank=True)
  categories=models.ManyToManyField(Category,related_name='packages')



class Category(models.Model):
  topic=models.ForeignKey(Package, related_name="categories")

当我尝试同步数据库时,它显示“未定义 NameError 类别”我尝试先放置类类别,然后再放置包,这次它显示“未定义 NameError 名称包”。

请帮我解决这个问题。

编辑: 感谢大家的帮助,从我对数据库中的知识知之甚少的情况来看,这里的教程似乎是错误的http://toys.jacobian.org/presentations/2007/pycon/tutorials/beginning/ 他将 Packages 中的字段 categories 定义为多对多,Category topic 中的字段定义为 Package 的外键,但外键是多对一的关系,因此实现存在缺陷。 我认为 django 试图以它的方式告诉它“字段'主题'的访问器与 m2m 字段'Package.categories'发生冲突。”字段“主题”的反向查询名称与 m2m 字段“”冲突 那是对的吗?

【问题讨论】:

  • 这似乎是一个错字:ForeignKey 应该指向主题模型,而不是包,这就是它被称为topic 的原因。但是你为什么要看一个五年前的幻灯片呢?里面的很多东西都过时了。
  • @DanielRoseman 您能否提供一些好的教程的链接。我在这里试过 [link]code.djangoproject.com/wiki/Tutorials[link] 大多数教程看起来晦涩难懂。

标签: python django nameerror


【解决方案1】:

"If you need to create a relationship on a model that has not yet been defined, you can use the name of the model, rather than the model object itself..."

class Package(models.Model):
   ...
  categories=models.ManyToManyField('Category', related_name='packages')

【讨论】:

  • 感谢它在不使用相关名称参数时有效。但是在使用related_name Error: One or more models did not validate:packages.category: Accessor for field 'topic' clashes with m2m field 'Package.categories'. Add a related_name argument to the definition for 'topic'. packages.category: Reverse query name for field 'topic' clashes with m2m field ' Package.categories'. Add a related_name argument to the definition for 'topic'. 时出现此错误我不完全理解它所说的内容。我该如何克服它。
  • 您需要为其中一个关系字段指定不同的related_name,或将其中一个设为单向。
【解决方案2】:

在定义 category ManyToManyField 时添加引号。 改为:

categories=models.ManyToManyField('Category',related_name='packages')

原因:Category 在添加该字段时未定义,因此需要在其周围添加引号,以便 django 稍后解决。

【讨论】:

  • 我是 django 新手,我按照你说的做了。这些是 class Category(models.Model): topic=models.ForeignKey('Package', related_name='categories') 的确切变化,这是在类 Package ` categories=models.ManyToManyField('Category',related_name='packages' ) `
  • 这是错误`错误:一个或多个模型未验证:packages.category:字段'topic'的访问器与m2m字段'Package.categories'发生冲突。为“topic”.packages.category 的定义添加一个 related_name 参数:字段“topic”的反向查询名称与 m2m 字段“Package.categories”冲突。在“主题”的定义中添加一个 related_name 参数。我什么都不懂,我是 django 的新手
  • 您可以更改topic=models.ForeignKey('Package', related_name='topics')。当您的代码尝试设置反向关系时,名称会发生​​冲突。
  • @JosyulaKrishna 你可能想阅读docs.djangoproject.com/en/dev/ref/models/fields/…
猜你喜欢
  • 2016-10-14
  • 2016-05-25
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
相关资源
最近更新 更多