【问题标题】:Saving m2m field in Django Admin fails with "ValueError: needs to have a value before this many-to-many relationship can be used"在 Django Admin 中保存 m2m 字段失败并显示“ValueError:需要有一个值才能使用这种多对多关系”
【发布时间】:2013-06-21 11:13:56
【问题描述】:

我得到了以下(相关)模型。用品是一个多对多的领域。

class Supplies(models.Model):
    id = models.IntegerField(primary_key=True, editable=False)
    name_html = models.CharField(max_length=100L)
    name_verbose = models.CharField(max_length=150L)
    class Meta:
        db_table = u'supplies'
    def __unicode__(self):
        return self.name_html

class Manufacturer(models.Model):
    id = models.IntegerField(primary_key=True, editable=False)
    name = models.CharField(max_length=135)
    country = models.ForeignKey(Country)
    supplies = models.ManyToManyField(Supplies, blank=True)
    class Meta:
        db_table = u'manufacturer'
    def __unicode__(self):
        return self.name
        return self.country

中间表:

CREATE TABLE IF NOT EXISTS `manufacturer_supplies` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `manufacturer_id` int(11) NOT NULL,
  `supplies_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `manufacturer_id` (`manufacturer_id`),
  KEY `supplies_id` (`supplies_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=174 ;
ALTER TABLE `manufacturer_supplies`
  ADD CONSTRAINT `manufacturer_supplies_ibfk_3` FOREIGN KEY (`supplies_id`) REFERENCES `supplies` (`id`),
  ADD CONSTRAINT `manufacturer_supplies_ibfk_2` FOREIGN KEY (`manufacturer_id`) REFERENCES `manufacturer` (`id`);

filter_horizontal 在 Django Admin 中完美显示了所有内容。但是当我试图保存一个新的“制造商”时,我得到:ValueError: "<Manufacturer: thisIsTheManufacturerName>" needs to have a value for field "manufacturer" before this many-to-many relationship can be used.

我想通过“制造商”,中间表中的字段manufacturer_id 是错误的原因。我很迷茫……

历史 当我设计我的数据库布局时,我不知道 Django 可以自己处理 m2m 关系。所以我开始使用through 定义的 m2m 模型。我得到了同样的错误。所以我删除了我的模型、数据库表并运行manage.py syncdb。然后 Django 自己创建了中间表。因为再次切换,所以贴出中间表布局,只是为了排除错误。

【问题讨论】:

  • 自定义 sql 是什么?它是你的吗?如果是,您在哪里看到这样的事情是必要的?你读过 django 的文档吗?
  • 我添加了注释为什么我添加了数据库布局。我已经阅读了关于 m2m 的 1.5 文档,以及许多其他论坛帖子、博客和 Stack Overflow 问题。
  • 尝试删除整个数据库,syncdb,然后重试。
  • 不幸的是,完全相同的行为。
  • 我假设您在 dropdb/syncdb 之前删除了所有自定义 sql。正确的?另外,我注意到你有blank=True,但没有null=True。您确实明白这意味着您的表单不需要supplies,但您的数据库需要。因此,这假设您正在对制造商的 save() 方法进行自定义操作。您的制造商的 __unicode__ 方法也有 2 个返回语句。除此之外,我被难住了,我想不出别的了。

标签: django orm django-admin many-to-many m2m


【解决方案1】:

问题本身并没有解决,但是失败的原因我现在很清楚了:

在 admin.py 中,我用 list_display 显示该字段(很遗憾,我没有在此提及,因为我认为它无关) - 但 docs 说 :

ManyToManyField 字段不受支持,因为这需要 对表中的每一行执行单独的 SQL 语句。如果你 尽管如此,还是想这样做,给你的模型一个自定义方法,然后添加 该方法的名称为 list_display。 (有关自定义的更多信息,请参见下文 list_display 中的方法。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多