如何使用反向外键创建一个新的Django实例而不将其保存到DB?

时间:2015-09-25 06:16:08

标签: python django django-orm

假设我有以下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将在实例化和保存之间进行更改,我通常会使用上面显示的第二种技术(以最大限度地减少数据库访问)。

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

# 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()

1 个答案:

答案 0 :(得分:1)

如果我理解你的意思......你想要a.MyModelB_a.new(my_int=6)之类的东西。像rails中的.build之类的东西!我担心django中不存在。

但是如果你因某些原因不想导入MyModelB,那么你可以使用一个解决方法,如果你对它好的话。

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

编辑:

或者您可以覆盖Manager类来实现自己的方法。我之前没有尝试覆盖RelatedManager,但use_for_related_fields显示它是allowed in django