Django型号多人外键

2021-06-14 23:00:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

syncdbAttributeError: 'ManyToManyField' object has no attribute 'ForeignKey'导致错误。如果在Stuff模型中同时包含两个字段ManyToManyFieldForeign Key字段,则会产生错误结果。

有没有办法让这两种关系都存在?谢谢你的意见。

3条回答
网友
1楼 ·

从根本上说,您会得到这样的错误:

$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')

抱歉,我对名字不是很有创意,这应该管用。

网友
2楼 ·

如果您想知道有多少information链接到每个stuff,django将提供一个默认的manager,允许您返回;为此,在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)

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

  • “什么是stuffXinformation?”
  • “对于stuffY,链接的information是什么?”
  • “为thingZ找到所有stuffinformation

此外,它还允许每个stuff有多个information,每个thing有多个stuff

在开始时写下这些问题将有助于开发准确的模型,而不必在数据库中建立不必要的链接/关系。

网友
3楼 ·

我的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关系定义一个related_name。。。

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

那么syncdb就会快乐。当然,你应该确定你需要两种关系。这里的通用实体名看起来可能有些混乱。

相关问题