如何使用反向外键创建新的 Django 实例而不将其保存到数据库?

How can I create a new Django instance using reverse-foreign key without saving it to DB?

假设我有以下 2 个 Django 模型:

class MyModelA(models.Model):
    my_int = models.IntegerField()

class MyModelB(models.Model):
    my_int = models.IntegerField()
    my_a = models.ForeignKey(MyModelA, related_name="MyModelB_a")

我可以通过两种方式创建 MyModelA 的实例:

# First technique:
>>> a = MyModelA.objects.create(my_int=5)

# Second technique:
>>> a = MyModelA(my_int=5)
>>> a.save()

如果我知道我不需要在实例化和保存之间更改 a,我会使用第一种技术(减少代码行数)。如果我知道 a 将在实例化和保存之间变化,我通常会使用上面显示的第二种技术(以最小化数据库访问)。

类似地,当我想通过反向外键关系从 MyModelA 中的方法创建 MyModelB 的实例时,我执行以下操作:

# First technique:
>>> b = self.MyModelB_a.create(my_int=6)

但我不知道如何使用第二种技术通过反向外键关系创建 MyModelB 的实例。怎么做?调用什么函数?我想使用 related_name MyModelB_a 创建一个实例而不将其保存到数据库,直到我明确调用 save()

# Second technique:
>>> b = a.MyModelB_a.WHAT-GOES-HERE(my_int=6)
>>> b.save()

如果我明白你的意思..你想要像 a.MyModelB_a.new(my_int=6) 这样的东西。例如 rails 中的 .build!恐怕 django 中不存在。

但是,如果您只是出于某种原因不想导入 MyModelB,如果您愿意,可以使用变通方法。

您可以使用a.MyModelB_a.model(my_int=6, my_a=a)

编辑:

或者您可以覆盖管理器 class 以实现您自己的方法。我之前没有尝试覆盖 RelatedManager,但它似乎是 use_for_related_fieldsallowed in django