Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django型号多,外键_Python_Database_Django_Models_Relationships - Fatal编程技术网

Python 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 =

试图更好地处理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)
    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?