Python Django自定义保存方法:至少接受3个参数(给定2个)
我对Django中模型的自定义保存方法有一个问题。 返回的错误为:Python Django自定义保存方法:至少接受3个参数(给定2个),python,django,django-rest-framework,Python,Django,Django Rest Framework,我对Django中模型的自定义保存方法有一个问题。 返回的错误为: Traceback (most recent call last): File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/django/core/handlers/base.py", line 114, in get_response response = wrapped_callback(request, *callb
Traceback (most recent call last):
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/django/core/handlers/base.py", line 114, in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/viewsets.py", line 78, in view
return self.dispatch(request, *args, **kwargs)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 57, in wrapped_view
return view_func(*args, **kwargs)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/views.py", line 399, in dispatch
response = self.handle_exception(exc)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/views.py", line 396, in dispatch
response = handler(request, *args, **kwargs)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/mixins.py", line 52, in create
self.object = serializer.save(force_insert=True)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/serializers.py", line 560, in save
self.save_object(self.object, **kwargs)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/serializers.py", line 935, in save_object
obj.save(**kwargs)
TypeError: save() takes at least 3 arguments (2 given)
这里使用的模型如下。这个想法是一种用于酒瓶的ERP,它可以填充用户的酒窖(酒窖)。
一个瓶子有4个外键:1个用户键、1个葡萄酒键和两个移动键,用于定义瓶子所在的位置以及是否已被评为(=醉酒)
瓶子的自定义保存方法如下所示。当我试图在Django Rest API中创建一个新瓶子时,会发生错误
这个save函数的特殊性是创建一个移动对象,瓶子有一个ForeignKey,带有save函数的user和wine参数
def save(self, wine, user, force_insert=True, *args, **kwargs):
d = datetime.now()
self.wine = wine #wine referencing issue
self.user = user
v = Container.objects.get(container_type='vinibar', user=user)
c = Container.objects.get(container_type='cellar', user=admin)
m = Movement(date=d, start=c, finish=v) #quantity=quantity?
self.mounted = m
self.date_mounted = d
super(Bottle, self).save(*args, **kwargs)
我不明白这个错误指的是哪一个论点,我已经用尽了我所能想到的一切
提前感谢您的帮助:)您的save()
方法至少需要三个参数:self
、wine
和user
:
def save(self, wine, user, force_insert=True, *args, **kwargs):
这意味着当kwargs
只包含一个值时,Django REST框架无法调用save()
,如下所示:
obj.save(**kwargs)
您需要将save()
的签名更改为:
def save(self, *args, **kwargs):
然后,您可以从
args
和kwargs
获取wine
、user
和其他参数的值(如果它们恰好由Django REST框架传递)。我注意到,在将装入的变量分配给self.mounted时,它没有定义
self.mounted = mounted
修复它有帮助吗?什么是堆栈跟踪?调用
save
@simeonviser的实际代码在哪里?我已经添加了堆栈跟踪。save方法直接在Django Rest Framework API中,该API创建通用视图集来创建和编辑模型,非常感谢您的快速回答。我的问题是,需要在保存对象之前创建挂载的移动对象。在哪一点上我应该给super.save()函数上面计算的参数?谢谢,它在最初的代码中,但为了测试我已经删除了它。它确实需要在那里,但它不能解决问题
self.mounted = mounted