保存模型并保存后获取,以用作外键来创建另一个模型

时间:2018-09-04 11:03:11

标签: django django-models

我有以下2种型号:

class Note(models.Model):
    name= models.CharField(max_length=35)

class ActionItem(models.Model):
    note = models.models.OneToOneField(Note, on_delete=models.CASCADE)
    target = models.CharField(max_length=35)
    category = models.ForeignKey(Category, blank=True, null=True, on_delete=models.CASCADE)

在其他模型中(基于某些条件),我会触发一个创建注释的实用函数:

def create_note(target=None, action=None):

    note = Note(target=target, name=name).save()
    transaction.on_commit(
        ActionItem(note=note, target=target).save())

我收到以下错误:

null value in column "note_id" violates not-null constraint
DETAIL:  Failing row contains (6, null).

如果我使用:

因此,我认为错误是由于save不会返回任何内容而出现的。 我需要将Note作为FK传递给ActionItem,请确保已保存。

2 个答案:

答案 0 :(得分:3)

模型的.save()方法不返回任何内容,因此您的note变量为None,因此,创建ActionItem对象的结果为{ {1}}供None参考,因此会引发错误。

我们可以使用note的{​​{1}}并返回对象来解决它:

Note.objects.create(..)

或者,我们可以先构造对象,然后.saves()构造它:

def create_note(target=None, action=None):
    note = Note.object.create(target=target, name=name)
    transaction.on_commit(lambda: ActionItem.object.create(note=note, target=target))

答案 1 :(得分:2)

您可以使用创建功能代替保存功能

def create_note(target=None, action=None):

    note = Note.objects.create(name=name)

    actionItem = ActionItem.object.create(note=note, target=target)