在 Django 管理中保存 m2m 字段失败并显示"ValueError: needs to have a value before this many-to-many relationship c



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

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模型开始。我也犯了同样的错误。所以我删除了我的模型DB表并运行了manage.py syncdb。然后Django自己创建了中间表。因为我再次切换,所以我发布了中间表布局,只是为了排除错误。

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

在admin.py中,我显示了带有list_display的字段(不幸的是,我在这里没有提到它,因为我认为它不相关),但文档说:

不支持ManyToManyField字段,因为这需要为表中的每一行执行单独的SQL语句。如果你尽管如此,要做到这一点,请为您的模型提供一个自定义方法,并添加将该方法的名称添加到list_display。(有关自定义的详细信息,请参阅下文list_display中的方法。)

相关内容

最新更新