簡體   English   中英

ValueError:在使用這種多對多關系之前,需要為字段“”賦值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM