0

我有两个模型OrderOrderItem.

class OrderItem(SmartModel):
    shopping_id = models.CharField(max_length=50,db_index=True)
    quantity = models.IntegerField(default=0)
    item = models.ForeignKey(Item)
    order = models.ForeignKey(Order)

这就是创建和保存OrderItem对象的方式

if not item_in_orders:
        # creat and save a new order item
        anon_user = User.objects.get(id=settings.ANONYMOUS_USER_ID) 
        try:
            order= Order.objects.get(pk=order_id)
        except:
            order = Order.objects.create(created_by=anon_user,modified_by=anon_user)

        oi=OrderItem.objects.create(order=order,shopping_id=_shopping_id(request),
                                          quantity=quantity,
                                          item=i,
                                          created_by=anon_user,
                                          modified_by=anon_user)
        oi.save()

现在我应该提到OrderItem上面的对象是在Order对象之前创建的。

class Order(SmartModel):
    email = models.EmailField(max_length=50,help_text="Needed as alternative")
    mobile = PhoneNumberField(max_length=20,default='+2507####')
    billing_name= models.CharField(max_length=50)
    billing_address= models.CharField(max_length=50)    
    billing_city = models.CharField(max_length=50)

两个模型都是 ModelForms 并且经过很好的验证,除了创建两个模型时,数据库中的两行是为Order. 我怀疑未填充的第一行是在创建 OrderItem 时由此代码创建的。

order = Order.objects.create(created_by=anon_user,modified_by=anon_user)

            oi=OrderItem.objects.create(order=order,shopping_id=_shopping_id(request),
                                              quantity=quantity,
                                              item=i,
                                              created_by=anon_user,
                                              modified_by=anon_user)
            oi.save()

第二行是在我保存Order对象时创建的,很好。

请记住,OrderItem之前创建Order的,后者是前者中的外键字段。

我对我的 django 应用程序的要求是在Order给定客户(在我的情况下)之前创建一个订单项。欢迎任何其他想法。

4

3 回答 3

0

好的如你所说

请记住,OrderItem 是在 Order 之前创建的,而后者是前者中的外键字段。

那么在这种情况下,你应该设计你的模型

class OrderItem(SmartModel):
    shopping_id = models.CharField(max_length=50,db_index=True)
    quantity = models.IntegerField(default=0)
    item = models.ForeignKey(Item)
    order = models.ForeignKey(Order,blank=True,null = True)

在这里,我给你如何Foreign key在表格中保存价值

在查询中

order = Order.objects.create(created_by=anon_user,modified_by=anon_user)

            oi=OrderItem.objects.create(order=order,shopping_id=_shopping_id(request),
                                              quantity=quantity,
                                              item=i,
                                              created_by=anon_user,
                                              modified_by=anon_user)
            oi.save()

我不知道是什么i 但是如果你要保存外键那么i 我必须实例Item

我只是假设一个简单的示例,假设如果您itemname 首先获取 from 表单,则必须在Item table 中过滤它。

喜欢 getitem = Item.objects.get(name= itemname)

然后你可以保存你的外键,比如

order = Order.objects.create(created_by=anon_user,modified_by=anon_user)

            oi=OrderItem.objects.create(order=order,shopping_id=_shopping_id(request),
                                              quantity=quantity,
                                              item=getitem,
                                              created_by=anon_user,
                                              modified_by=anon_user)
            oi.save()
于 2013-02-28T11:21:48.630 回答
0

看起来你是

  1. 创建一个空白订单以使用 OrderItem 保存(以满足外键)
  2. 在创建 OrderItem 后创建另一个完全填充的 Order(因为您提到 Order 是在 OrderItem 之后创建的)。我假设,这没有显示在上面的代码中。

这就是您看到创建了两个 Order 实例的原因。

您可以使用电子邮件、地址等订单信息更新您在步骤 1 中创建的订单并保存,而不是第二次创建新订单(步骤 2)。

编辑:添加了详细的操作方法...

在您的代码中,您将创建第二个订单。不要在那里创建新订单,而是使用对第 1 步中创建的订单的引用(您发布的代码中的订单变量),一旦可用,使用电子邮件和地址信息对其进行更新,然后对其调用 save()。这将更新数据库中的订单,而不是创建新实例。

于 2013-02-28T11:29:25.020 回答
0
order = Order.object.create(
    created_by=anon_user, 
    modified_by=anon_user
    )


OrderItem.object.create(
    order = order, 
    shopping_id = _shopping_id(request),
    quantity=quantity,
    item=i,
    created_by=anon_user,
    modified_by=anon_user
    )

//To access the order after saving the above info
//For example:

order.email = 'anyone@gmail.com'
order.save()
于 2013-02-28T11:29:31.407 回答