3

试图更好地处理 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' object has no attribute 'ForeignKey'。如果我在模型中同时包含ManyToManyFieldForeign Key字段,则会导致错误。Stuff

有没有办法让这两种关系都存在?感谢您的任何想法。

4

3 回答 3

5

information如果您想知道每个链接有多少stuff,django 将提供一个默认管理器,允许您向后退;为此,您不需要外键stuff

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)

该模型将允许您执行以下查询:

  • “有什么informationstuff X?”
  • “对于stuff Y,有什么information联系?”
  • “全部stuff找到我informationthing Z

此外,它将允许您拥有多个informationfor eachstuff和 multiple stufffor each thing

在开始时写下这些问题将帮助您开发准确的模型,而无需在数据库中使用不必要的链接/关系。

于 2012-07-11T04:31:09.277 回答
0

我的 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'.

这可能足以让你继续前进。related_nameManyToManyField关系和ForeignKey从信息到东西的关系定义一个...

information = models.ManyToManyField('Information', related_name='stuff_many_set')
stuff = models.ForeignKey('Stuff', related_name = 'info_set')

然后syncdb会很开心。当然,你应该确定你需要这两种关系。使用此处的通用实体名称,看起来可能会有些混乱。

于 2012-07-11T04:05:43.400 回答
0

基本上你会得到这样的错误:

$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 将生成相同的名称,从而产生冲突。

要解决这个问题,就像错误状态一样,您需要添加related_name这种方式 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')

对不起,我的名字不是很有创意,这应该可以。

于 2012-07-11T04:15:05.153 回答