Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Tastypie覆盖模型字段_Python_Django_Tastypie - Fatal编程技术网

Python 使用Tastypie覆盖模型字段

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

在我的一个视图中,我定义了一个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):
        # 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的值