Python Django型号多,外键
试图更好地处理django数据库关系。 任何想法都很感激 考虑以下示例模型:Python Django型号多,外键,python,database,django,models,relationships,Python,Database,Django,Models,Relationships,试图更好地处理django数据库关系。 任何想法都很感激 考虑以下示例模型: class Things(models.Model): name = models.CharField(max_length=20) class Stuff(models.Model): name = models.CharField(max_length=20) information = models.ManyToManyField('Information') things =
class Things(models.Model):
name = models.CharField(max_length=20)
class Stuff(models.Model):
name = models.CharField(max_length=20)
information = models.ManyToManyField('Information')
things = models.ForeignKey('Things')
class Information(models.Model):
name = models.CharField(max_length=20)
stuff = models.ForeignKey('Stuff')
syncdb
导致错误:AttributeError:“ManyToManyField”对象没有属性“ForeignKey”
。如果在Stuff
模型中同时包含ManyToManyField
和外键
字段,则会产生错误
有没有办法让这两种关系都存在?谢谢你的建议 我的django版本提供了更多信息:
Error: One or more models did not validate:
foo.stuff: Reverse query name for m2m field 'information' clashes with field 'Information.stuff'. Add a related_name argument to the definition for 'information'.
foo.information: Reverse query name for field 'stuff' clashes with m2m field 'Stuff.information'. Add a related_name argument to the definition for 'stuff'.
这可能足够让你走了。为ManyToManyField
关系和从信息到内容的ForeignKey
关系定义一个相关的\u名称
information = models.ManyToManyField('Information', related_name='stuff_many_set')
stuff = models.ForeignKey('Stuff', related_name = 'info_set')
然后
syncdb
会很高兴。当然,你应该确定你需要这两种关系。对于这里的通用实体名称,看起来可能会有一些混淆。基本上,您会得到如下错误:
$python manage.py syncdb
Error: One or more models did not validate:
t.stuff: Reverse query name for m2m field 'information' clashes with field 'Information.stuff'. Add a related_name argument to the definition for 'information'.
t.information: Reverse query name for field 'stuff' clashes with m2m field 'Stuff.information'. Add a related_name argument to the definition for 'stuff'.
为什么??如果有两个表相互引用,这里的问题是,当应用反向查找时,django将生成相同的名称,从而创建冲突
要解决这个问题,就像错误状态一样,您需要添加相关的\u名称
,这样django知道如何区分不同的反向调用
from django.db import models
class Things(models.Model):
name = models.CharField(max_length=20)
class Stuff(models.Model):
name = models.CharField(max_length=20)
information = models.ManyToManyField('Information', related_name = 'information_information')
things = models.ForeignKey('Things')
class Information(models.Model):
name = models.CharField(max_length=20)
stuff = models.ForeignKey('Stuff', related_name = 'information_stuff')
很抱歉,我对这些名字不是很有创意,这应该行。如果你想知道每个
东西链接了多少信息
,django将提供一个默认值,允许你向后走;为此,在文件中不需要外键
class Things(models.Model):
name = models.CharField(max_length=20)
class Stuff(models.Model):
name = models.CharField(max_length=20)
information = models.ManyToManyField('Information')
things = models.ForeignKey('Things')
class Information(models.Model):
name = models.CharField(max_length=20)
此模型将允许您执行以下查询:
- “关于
东西X
的信息是什么?”
- “对于
资料
Y
,链接了哪些信息
?”
- “为我找到
东西的所有东西
和信息
,
Z
”
此外,它还允许您为每个东西提供多个信息
,为每个东西提供多个东西
在开始时写下这些问题将有助于开发准确的模型,而不会在数据库中产生不必要的链接/关系。是否存在冲突。在Stuff中,您有很多信息,但在ManyToOne中,信息中有很多信息。从您的代码示例中无法判断信息和内容之间的关系应该是一对多还是多对多。其思想是Stuff
可以有多个信息,但是,信息
引用了一种类型的东西
。因此,从Stuff
到Information
的人很多,从Information
到Stuff
的外键也很多。这在我脑子里很有用,但在Django却不行。有什么想法吗?谢谢你的意见。然而,在模型中添加“related_name”参数并没有解决这个问题。Python仍然说:“ManyToManyField”对象没有属性“ForeignKey”
,除非我在Stuff模型上同时有外键和ManyToManyField。@NickB您一定在做其他事情,因为我发布的示例工作得很好,您必须测试自己的代码,这可能会有另一个问题。谢谢您的输入。然而,在模型中添加“related_name”参数并没有解决这个问题。Python仍然说:“ManyToManyField”对象没有属性“ForeignKey”,前提是我在Stuff模型上同时有一个外键和一个ManyToManyField。您使用什么作为相关的\u名称
参数?您可能与django生成的某个值发生冲突。另外:您使用的是什么版本的django?