2

我很困惑为什么当我运行这段代码时它会返回一个错误

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

3 回答 3

6

这是因为create需要关键字参数,例如

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

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

于 2019-09-10T06:04:21.187 回答
1

引擎盖下的 create 函数看起来不像这样:

def create(self, **data):
   pass

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

Product.objects.create(my_form.cleaned_data)

您正在传递两个位置参数,一个是objectspython 处理类和方法的方式,另一个是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']
于 2019-09-10T06:11:59.830 回答
0

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

Product.objects.create(field1="<field 1 data>", field2=<field2 data>)
于 2019-09-10T06:17:44.890 回答