我很困惑为什么我在运行此代码时会返回错误
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)
答案 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