我得到了以下(相关)模型。供应是一个多对多的领域。
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创建了中间表本身。因为我再次切换,我发布了中间表布局,只是为了排除错误。
答案 0 :(得分:0)
问题本身并没有解决,但它失败的原因现在让我清楚了:
在admin.py中,我显示带有list_display
的字段(我很遗憾在这里没有提及,因为我认为这是无关的) - 但是docs说
:
不支持ManyToManyField字段,因为这将需要 为表中的每一行执行单独的SQL语句。如果你 尽管如此,还是要为您的模型提供自定义方法,然后添加 该方法的名称为list_display。 (有关定制的更多信息,请参阅下文 list_display中的方法。)