【发布时间】:2013-12-03 22:07:25
【问题描述】:
我对 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, *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)
这里使用的模型如下。这个想法是一种用于填充用户酒窖(vinibars)的酒瓶的 ERP。 一个瓶子有 4 个外键:1 个用户、1 个酒和两个动作,它们定义了瓶子在哪里以及它是否被评级 (=drunk)
class Wine(models.Model):
name = models.CharField(max_length=100, blank=True)
price = models.IntegerField()
quantity = models.IntegerField()
description = models.TextField()
added_on = models.DateTimeField(auto_now_add=True)
class Container(models.Model):
CONTAINER_TYPE = (
('cellar', 'Cellar'),
('vinibar', 'Vinibar'),
('history', 'History'),
)
container_type = models.CharField(max_length=10, choices=CONTAINER_TYPE)
user = models.ForeignKey(User, related_name='user_id')
class Movement(models.Model):
date = models.DateTimeField()
start = models.ForeignKey(Container, related_name='movement_start')
finish = models.ForeignKey(Container, related_name='movement_finish')
quantity = models.IntegerField(default=1)
class Bottle(models.Model):
wine = models.ForeignKey(Wine, null=False)
user = models.ForeignKey(User, null=False)
mounted = models.ForeignKey(Movement, related_name='bottle_mounted')
rated = models.ForeignKey(Movement, null=True, blank=True, default=None, related_name='bottle_rated')
date_mounted = models.DateTimeField()
date_rated = models.DateTimeField(null=True, blank=True, default=None)
rating = models.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(5)], null=True, blank=True, default=None)
comment = models.TextField(null=True, blank=True, default=None)
Bottle 的自定义保存方法如下。当我尝试在我的 Django Rest API 中创建一个新瓶子时发生错误
这个save函数的特殊性是创建一个Movement对象,Bottle有一个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的实际代码在哪里 -
@SimeonVisser 我已经添加了堆栈跟踪。 save 方法直接在 Django Rest Framework API 中创建通用 ViewSet 来创建和编辑模型
标签: python django django-rest-framework