Python 使用Tastypie覆盖模型字段
在我的一个视图中,我定义了一个mixin,根据用户的会话详细信息动态设置许多模型(包括客户机模型)的Python 使用Tastypie覆盖模型字段,python,django,tastypie,Python,Django,Tastypie,在我的一个视图中,我定义了一个mixin,根据用户的会话详细信息动态设置许多模型(包括客户机模型)的tech和operator字段,这样用户就不需要手动填写它们。该混合物如下所示: class GetTechMixin(object): """ View mixin that when the form is saved, sets the site_user and operator. """ def form_valid(self, form):
tech
和operator
字段,这样用户就不需要手动填写它们。该混合物如下所示:
class GetTechMixin(object):
"""
View mixin that when the form is saved, sets the
site_user and operator.
"""
def form_valid(self, form):
# Get user
user = self.request.user
# Get tech for this user
site_user = SiteUser.objects.get(user=user)
# Override the tech and operator fields
form.instance.tech = site_user
form.instance.operator = site_user.operator
# Save the object
self.object = form.save()
# Return success URL
return HttpResponseRedirect(self.get_success_url())
def obj_create(self, bundle, **kwargs):
# Get tech for this user
site_user = SiteUser.objects.get(user=bundle.request.user)
bundle.obj = self._meta.object_class()
for key, value in kwargs.items():
setattr(bundle.obj, key, value)
# Override the tech and operator fields
setattr(bundle.obj, 'tech', site_user)
setattr(bundle.obj, 'operator', site_user.operator)
self.authorized_create_detail(self.get_object_list(bundle.request), bundle)
bundle = self.full_hydrate(bundle)
return self.save(bundle);
为了做同样的事情,我还设置了以下Tastypie API资源:
class ClientResource(AbstractModelResource):
class Meta(AbstractModelResource.Meta):
queryset = Client.objects.all()
resource_name = 'client'
def obj_create(self, bundle, **kwargs):
# Get tech for this user
site_user = SiteUser.objects.get(user=bundle.request.user)
# Override the tech and operator fields
bundle.obj.tech = site_user
bundle.obj.operator = site_user.operator
super(ClientResource, self).obj_create(bundle, **kwargs)
然而,这似乎不起作用。当使用PDB运行它时,我可以将字段添加到bundle
OK,但当我让它运行时,我会抛出以下错误:
{“error\u message”:(1048,\“Column'operator\u id'不能为null\”,
“回溯”:“回溯(最近一次调用):\n\n文件”
\“/home/matthew/Projects/Myproject/venv/local/lib/python2.7/site packages/tastype/resources.py\”,
第217行,在wrapper-response=callback(请求,*args,
**kwargs)\n\n文件\“/home/matthew/Projects/Myproject/venv/local/lib/python2.7/site packages/tastype/resources.py\”,
第459行,在调度列表中\n返回self.dispatch('list',request,
**kwargs)\n\n文件\“/home/matthew/Projects/Myproject/venv/local/lib/python2.7/site packages/tastype/resources.py\”,
第491行,在分派\n响应=方法(请求,**kwargs)\n\n文件中
\“/home/matthew/Projects/Myproject/venv/local/lib/python2.7/site packages/tastype/resources.py\”,
第1357行,在post_列表中\n更新的_bundle=self.obj_create(bundle,
**self.remove_api_resource_names(kwargs))\n\n文件\“/home/matthew/Projects/Myproject/app_api/api.py\”,第49行,在
obj_创建\n超级(ClientResource,self)。obj_创建(bundle,
**kwargs)\n\n文件\“/home/matthew/Projects/Myproject/venv/local/lib/python2.7/site packages/tastype/resources.py\”,
第2150行,在obj\u create\n返回self.save(bundle)文件中\n\n
\“/home/matthew/Projects/Myproject/venv/local/lib/python2.7/site packages/tastype/resources.py\”,
第2296行,在save\n bundle.obj.save()文件中\n\n
\“/home/matthew/Projects/Myproject/venv/local/lib/python2.7/site packages/django/db/models/base.py\”,
第546行,在save\n force\u update=force\u update中,
更新\u字段=更新\u字段\n\n文件
\“/home/matthew/Projects/Myproject/venv/local/lib/python2.7/site packages/django/db/models/base.py\”,
第650行,在save\u base\n result=manager.\u insert([self])中,
字段=字段,返回\u id=update\u pk,using=using,raw=raw)\n\n文件
\“/home/matthew/Projects/Myproject/venv/local/lib/python2.7/site packages/django/db/models/manager.py\”,
第215行,在插入中\n返回插入查询(self.model、objs、fields、,
**kwargs)\n\n文件\“/home/matthew/Projects/Myproject/venv/local/lib/python2.7/site packages/django/db/models/query.py\”,
第1661行,在insert\u查询返回中\n
query.get\u编译器(using=using).execute\u sql(return\u id)\n\n文件
\“/home/matthew/Projects/Myproject/venv/local/lib/python2.7/site packages/django/db/models/sql/compiler.py\”,
第937行,在execute\u sql\n cursor.execute(sql,参数)文件中\n\n
\“/home/matthew/Projects/Myproject/venv/local/lib/python2.7/site packages/django/db/backends/util.py\”,
执行中的第41行\n返回self.cursor.execute(sql,params)文件\n\n
\“/home/matthew/Projects/Myproject/venv/local/lib/python2.7/site packages/django/db/backends/mysql/base.py\”,
第127行,在execute six.reraise(utils.IntegrityError,
utils.IntegrityError(*tuple(e.args)),sys.exc_info()[2])\n\n文件
\“/home/matthew/Projects/Myproject/venv/local/lib/python2.7/site packages/django/db/backends/mysql/base.py\”,
执行中的第120行\n返回self.cursor.execute(查询,参数)\n\n
文件
\“/home/matthew/Projects/Myproject/venv/local/lib/python2.7/site packages/MySQLdb/cursors.py\”,
第201行,在execute\n self.errorhandler(self、exc、value)文件中\n\n
\“/home/matthew/Projects/Myproject/venv/local/lib/python2.7/site packages/MySQLdb/connections.py\”,
第36行,在defaulterrorhandler中\n升起errorclass,
errorvalue\n\nIntegratyError:(1048,\“Column'operator\u id'不能为空
空\“”\n“}
在添加字段后,我尝试了使用bundle.obj.save()和不使用bundle.obj.save()两种方法,但似乎没有什么不同
obj_是否创建了覆盖这些值的正确位置?如果是这样的话,谁能指出我哪里做错了。如果没有,我应该去哪里寻找呢?如果有人发现了这个,我会找到一个解决方案。最简单的方法就是用一个新方法覆盖obj_create方法,如下所示:
class GetTechMixin(object):
"""
View mixin that when the form is saved, sets the
site_user and operator.
"""
def form_valid(self, form):
# Get user
user = self.request.user
# Get tech for this user
site_user = SiteUser.objects.get(user=user)
# Override the tech and operator fields
form.instance.tech = site_user
form.instance.operator = site_user.operator
# Save the object
self.object = form.save()
# Return success URL
return HttpResponseRedirect(self.get_success_url())
def obj_create(self, bundle, **kwargs):
# Get tech for this user
site_user = SiteUser.objects.get(user=bundle.request.user)
bundle.obj = self._meta.object_class()
for key, value in kwargs.items():
setattr(bundle.obj, key, value)
# Override the tech and operator fields
setattr(bundle.obj, 'tech', site_user)
setattr(bundle.obj, 'operator', site_user.operator)
self.authorized_create_detail(self.get_object_list(bundle.request), bundle)
bundle = self.full_hydrate(bundle)
return self.save(bundle);
检查
site\u user.operator的值