代码之家  ›  专栏  ›  技术社区  ›  Thierry Lam

在Django保存一个Manytomanyfield和一个Foreignkey

  •  1
  • Thierry Lam  · 技术社区  · 15 年前

    我有以下型号:

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

    我可能有一些打字错误,但上面的工作很好,但我只是不喜欢保存对象这么多次。有没有更好的方法,从零开始创建一个比萨饼对象与目前的模型以上?

    2 回复  |  直到 15 年前
        1
  •  3
  •   Alasdair    15 年前

    您可以使用 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 模型 Pizza 可以有多个 价格 . 这就是你的意思吗?定义价格foreignkey-in 披萨 每批比萨饼一个价格。

        2
  •  2
  •   Kai    15 年前

    如果数据库中没有对象,就无法保存外键。Django需要知道 id 在外部对象可以引用它之前分配给它。

    您可以抽象代码,这样您就不会看到所有的save(),但在对象被用作外键之前,它们仍然必须出现。