[英]ValueError: needs to have a value for field “id” before this many-to-many relationship can be used
[英]ValueError: needs to have a value for field "" before this many-to-many relationship can be used
Django 版本:1.10.4 异常类型:ValueError
Exception Value:
"<SchoolBook: 0 test1 Test2 Test3 2011 122>" needs to have a value for field "schoolbook" before this many-to-many relationship can be used.
请帮助避免此错误:
class Subject(models.Model):
name = models.CharField(max_length=256)
slug = models.SlugField(max_length=256, blank=True)
def __str__(self):
return self.name
def save(self, *args, **kwargs):
if not self.id:
self.slug = slugify(self.name, separator='_')
return super(Subject, self).save(*args, **kwargs)
class SchoolBook(models.Model):
parent_subject = models.ManyToManyField(Subject)
year = models.SmallIntegerField()
name = models.CharField(max_length=256,blank=True)
autors = models.CharField(max_length=256)
slug = models.SlugField(max_length=256, blank=True, unique=True)
f_file = models.FileField(upload_to=directory_path)
def __str__(self):
return '{0} {1} {2}'.format(
self.name, self.autors, self.year)
def save(self, *args, **kwargs):
if not self.id:
subject_name = [self.parent_subject.values()[i]['name'] for i in range(len(self.parent_subject.values()))]
self.name = ' '.join(subject_name)
self.slug = slugify("{} {} {} {} {}".format(self.name, self.autors,self.year, self.pages, self.c_class))
return super(SchoolBook, self).save(*args, **kwargs)
问题是当我试图保存 object 时。
保存实例之前,您无法访问多对多关系的相关对象! 实例必须有一个id
为中间M2N表指向它的外键(按名称schoolbook
,因此错误消息):
def save(self, *args, **kwargs):
if not self.id:
super(SchoolBook, self).save(*args, **kwargs)
# process self.parent_subject (should be called ...subjects, semantically)
super(SchoolBook, self).save(*args, **kwargs)
这是对(令人难忘的)@user2390182 的回答的一个小修正。
我不确定它是什么时候引入的,但是model.save()
方法现在有一个force_insert
参数,它强制执行 SQL INSERT
语句。 但是,这不会在保存前将.pk
设置为 None。
因此,以防万一设置force_insert=True
(例如, factory-boy
设置),以下代码有效,而 @user2390182 对 super().save 的第二次调用将引发重复键错误:
def save(self, force_insert=False, *args, **kwargs):
if not self.pk:
super(SchoolBook, self).save(force_insert, *args, **kwargs)
force_insert = False
# process self.parent_subject (should be called ...subjects, semantically)
super(SchoolBook, self).save(force_insert, *args, **kwargs)
附言。 force_insert
是第一个参数,因此它可以作为位置参数向上传递。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.