create()接受1个位置参数,但给出了2个? Django的

时间:2019-09-10 05:58:55

标签: python django cleaned-data

我很困惑为什么我在运行此代码时会返回错误

  

create()接受1个位置参数,但给出了2个

if request.method == "POST":
my_form = RawProductCreateForm(request.POST)
if my_form.is_valid():
    Product.objects.create(my_form.cleaned_data)

但是当我在create方法上进行修改并在传递清除的数据之前添加**时,它将起作用!

Product.objects.create(**my_form.cleaned_data)

3 个答案:

答案 0 :(得分:3)

这是因为create采用了关键字参数,例如

    Product.objects.create(product_name="Dish Soap", product_price=73)

放置**之前,告诉模型将my_form.cleaned_data视为关键字参数字典。

答案 1 :(得分:1)

内部的create函数看起来更像这样:

def create(self, **data):
   pass

如您所见,您有一个位置参数self,另一个只是关键字词典。当您像这样调用此函数时:

Product.objects.create(my_form.cleaned_data)

您要传递两个位置参数,一个是objects,这是python处理类和方法的方式,另一个是my_form.cleaned_data,但是该函数仅显示一个位置和任意数量的命名参数。 在第二次通话中:

Product.objects.create(**my_form.cleaned_data)

让我们说my_form.cleaned_data像这样:

{ 
  'age': 1,
  'name': 'good product'
}

所以第二次通话的等价性是

Product.objects.create(name='good product', age=1)

如您所见,您只有一个位置参数objects和2个命名参数。 在创建函数中,您可以引用如下数据:

def create(self, **data):
   name = data['name']
   age = data['age']

答案 2 :(得分:0)

当您尝试插入数据而没有指向模型中定义的字段时,会发生这种情况。 要解决此问题,您必须在domain内部使用赋值运算符传递字段名称。

mysite.nl