私のビューの 1 つで、ユーザーのセッションの詳細に基づいて Client モデルを含む多数のモデルのフィールドtech
とフィールドを動的に設定する mixin を定義し、ユーザーが手動で入力する必要がないようにしました。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())
また、同じことを行う目的で、次の 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_message": "(1048, \"Column 'operator_id' cannot be null\")", "traceback": "Traceback (最新の呼び出しが最後):\n\n ファイル \"/home/matthew/Projects/ Myproject/venv/local/lib/python2.7/site-packages/tastypie/resources.py\"、217 行目、ラッパー内\n response = callback(request, *args, **kwargs)\n\n ファイル \ "/home/matthew/Projects/Myproject/venv/local/lib/python2.7/site-packages/tastypie/resources.py\"、459 行目、dispatch_list\n return self.dispatch('list', request, **kwargs)\n\n ファイル \"/home/matthew/Projects/Myproject/venv/local/lib/python2.7/site-packages/tastypie/resources.py\"、行 491、ディスパッチ\n 応答= method(request, **kwargs)\n\n ファイル \"/home/matthew/Projects/Myproject/venv/local/lib/python2.7/site-packages/tastypie/resources.py\"、1357 行目、post_list 内\n updated_bundle = self.obj_create(bundle, **self.remove_api_resource_names(kwargs))\n\n ファイル \"/home/matthew/ Projects/Myproject/app_api/api.py\"、49 行目、obj_create\n super(ClientResource, self).obj_create(bundle, **kwargs)\n\n ファイル \"/home/matthew/Projects/Myproject/ venv/local/lib/python2.7/site-packages/tastypie/resources.py\"、2150 行目、obj_create\n return self.save(bundle)\n\n ファイル \"/home/matthew/Projects/ Myproject/venv/local/lib/python2.7/site-packages/tastypie/resources.py\"、2296 行目、保存\n bundle.obj.save()\n\n ファイル \"/home/matthew/ Projects/Myproject/venv/local/lib/python2.7/site-packages/django/db/models/base.py\"、546 行目、保存\n force_update=force_update、update_fields=update_fields)\n\n ファイル \"/home/matthew/Projects/Myproject/venv/local/lib/python2.7/site-packages/django/db/models/base.py\"、650 行目save_base\n result = manager._insert([self], fields=fields, return_id=update_pk, using=using, raw=raw)\n\n ファイル \"/home/matthew/Projects/Myproject/venv/local/lib /python2.7/site-packages/django/db/models/manager.py\"、215 行目、_insert 内\n return insert_query(self.model, objs, fields, **kwargs)\n\n File \" /home/matthew/Projects/Myproject/venv/local/lib/python2.7/site-packages/django/db/models/query.py\"、1661 行目、insert_query\n return query.get_compiler(using=using) ).execute_sql(return_id)\n\n ファイル \"/home/matthew/Projects/Myproject/venv/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py\", 937行目、execute_sql\n cursor.execute(sql, params)\n\n ファイル \"/home/matthew/Projects/Myproject/venv/local/lib/python2.7/site-packages/django/db/backends/util. py\"、41 行目、実行中\n return 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 行目、実行中\n 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 行目、 in execute\n return self.cursor.execute(query, args)\n\n ファイル \"/home/matthew/Projects/Myproject/venv/local/lib/python2.7/site-packages/MySQLdb/cursors.py \"、201 行目、実行中\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\nIntegrityError: (1048, \"列 'operator_id' を null にすることはできません\")\n"}
I've tried it both with and without bundle.obj.save() after adding the fields and it doesn't seem to make a difference.
Is obj_create the correct place to override these values? If so, can anyone point out where I've goine wrong. If not, where should I be looking?