在Django中保存ManyToManyField和ForeignKey

时间:2009-10-27 21:53:44

标签: django

我有以下型号:

class City(models.Model):
    name = models.CharField(max_length=100)

class Pizza(models.Model):
    name = models.CharField(max_length=100)
    cities = models.ManyToManyField('City')

class Price(models.Model):
    cad = models.DecimalField()
    usd = models.DecimalField()
    pizza = models.ForeignKey(Pizza)

我可以使用以下代码创建一个全新的披萨:

new_pizza = Pizza(name='Canadian')
new_pizza.save()
# I already calculated the following before, the syntax might not 
# be correct but that's how you see it from the shell
new_pizza.cities = [<City: Toronto>, <City: Montreal>]
new_pizza.save()
new_price = Price(cad=Decimal('9.99'), usd=Decimal('8.99'), pizza=new_pizza.id)
new_price.save()

我可能在这里和那里有一些错字但上面工作正常,但我不喜欢这么多次保存对象。是否有更好的方法从头开始使用上面的当前模型创建Pizza对象?

2 个答案:

答案 0 :(得分:3)

您可以使用Model.objects.create方法创建新实例,保存并返回指向新对象的指针,准备定义与其他实例的关系。

#create a new Pizza
#There's no need to explicitly save the new Pizza instance
new_pizza = Pizza.objects.create(name='Canadian')

#Add Cities to Pizza
#Here, Toronto and Montreal are City instances you created earlier
#There's no need to save new_pizza after adding cities
new_pizza.cities.add(Toronto, Montreal)

#Create a new Price object for new_pizza
#There's no need to explicitly save new_pizza or the new Price instance.
new_pizza.price_set.create(usd=Decimal('8.99'),cad=Decimal('9.99'))

请注意,通过在Price模型中定义披萨ForeignKey,Pizza可以有多个Price。这是你的意思吗?在Pizza中定义一个价格ForeignKey将为每个Pizza提供一个价格。

答案 1 :(得分:2)

如果没有首先存在于数据库中的对象,则无法保存外键。 Django需要知道分配给异物的id才能引用它。

你可能会抽象代码,这样你就不会看到所有的save(),但是在将对象用作外键之前它们仍然必须发生。