Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何保存外键?_Django_Foreign Keys - Fatal编程技术网

Django 如何保存外键?

Django 如何保存外键?,django,foreign-keys,Django,Foreign Keys,我有两种型号Order和OrderItem 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) 这就是我创建和保存OrderIt

我有两种型号
Order
OrderItem

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)
这两个模型都是模型形式,并且都经过了良好的验证,只是在创建这两个模型时,数据库中会为
顺序创建两行。我怀疑未填充的第一行是在创建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
之前创建的,后者是前者中的foreignkey字段

我对django应用程序的要求是在给客户(在我的例子中是
订单
)之前创建订单项。欢迎提出任何其他想法。

如你所说,好的

请记住,OrderItem是在Order之前创建的,后者是Order中的foreignkey字段

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

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)
在这里,我告诉您如何在表中保存
外键

在查询中

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
必须给我
项的实例

我只是举一个简单的例子,假设您首先从表单获取
itemname
,您必须在
Item
表中过滤它

比如
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()
看起来你是

  • 创建要与OrderItem一起保存的空白订单(以满足外键要求)
  • 在创建OrderItem之后创建另一个完全填充的订单(因为您提到订单是在OrderItem之后创建的)。我假设,上面的代码中没有显示这一点
  • 这就是为什么要创建两个订单实例

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

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


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

    i的角色是什么?为什么订单项在订单之前创建?订购项目需要订购国外产品key@masterofdestiny
    i
    是一个标签错误的变量,它包含一个项目,将更改其名称,但这不是问题所在,我可以对您进行测量。我发布的代码较少,通常我不会得到太多帮助,因为在我的问题中发布了太多的代码。所以我发布了必要的信息。@catherine现在我之所以这样做,是因为在客户创建订单项目后,他们可以提供详细信息,即
    订单
    ,如果有其他方法,请建议我。@Mats_入侵检查更新回答您我的朋友了解我的问题(疯狂),你需要从我的代码中看到什么来帮助我解决这个问题。我发布了更少的代码以避免让人厌烦。我添加了更多的细节。我希望这能清楚地说明如何解决这个问题。嗯……这也行不通,在数据库中创建了三行。好的,还有什么方法可以在不使用外键的情况下将订单项和客户信息作为一个对象返回。如果您愿意,我想查看您的代码并修复它。把整个项目都寄给我。我们在这里无法理解,在这里很难教你。说真的,有些人只是请告诉我应该怎么做,我在这个发展中的领域是新手。如果我们进行长时间的交谈,我有时会为其他人这样做。你只需在附加之前压缩你的项目
    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()