Django 试图在覆盖默认值时保存数据时出现不清楚的错误';创建';方法
试图为我的模型编写自定义Django 试图在覆盖默认值时保存数据时出现不清楚的错误';创建';方法,django,django-rest-framework,Django,Django Rest Framework,试图为我的模型编写自定义create方法,但遇到一些不清楚的错误 这是我的密码: #models.py: 类ItemModel(models.Model): item_id=models.CharField(最大长度=10,主键=True) name=models.CharField(最大长度=40) active=models.BooleanField(默认值=True) 定义(自我): 返回self.item\u id 类ItemVersion(models.Model): item\u v
create
方法,但遇到一些不清楚的错误
这是我的密码:
#models.py:
类ItemModel(models.Model):
item_id=models.CharField(最大长度=10,主键=True)
name=models.CharField(最大长度=40)
active=models.BooleanField(默认值=True)
定义(自我):
返回self.item\u id
类ItemVersion(models.Model):
item\u ver\u id=models.CharField(最大长度=13,主键=True)
item\u ver=models.TextField()
config=models.TextField()
model=models.ForeignKey(ItemModel,on_delete=models.CASCADE,默认值=0)
会话id=models.CharField(最大长度=40,默认值=0)
创建日期=models.DateTimeField(auto\u now=False,auto\u now\u add=True)
finished=models.BooleanField(默认值=False)
def名称(自我):
返回self.model.name
定义(自我):
返回str(self.model)
#serializers.py:
类ItemModelSerializer(serializers.ModelSerializer):
item_id=serializers.RegexField(regex='^\d{3}-\d{9}$',allow_blank=False)
name=serializers.CharField(最小长度=6,最大长度=50,允许空白=False)
类元:
模型=项目模型
字段='\uuuu所有\uuuu'
类ItemVersionSerializer(serializers.ModelSerializer):
item_ver_id=serializers.RegexField(regex='^r\d{2}$',allow_blank=False)
session_id=serializers.RegexField(regex='^s\d{2}$',allow_blank=False)
link=serializers.SerializerMethodField()
名称=序列化程序。SerializerMethodField()
config=serializers.CharField(最小长度=6)
item\u ver=serializers.CharField(最小长度=6)
def get_名称(自身、obj):
返回obj.name()
def get_链接(自身、obj):
链接https://example.net/'+str(对象模型)
+str('-dyn'+'/?iv_id='+str(对象项版本id)
+“&sessiond=”+str(obj.session_id)
返回链接
#views.py:
类ItemModelViewSet(viewsets.ModelViewSet):
queryset=ItemModel.objects.all()
serializer\u class=ItemModelSerializer
查找\u字段='item\u id'
类ItemVersionViewSet(viewsets.ModelViewSet):
serializer_class=ItemVersionSerializer
查找\字段='项目\版本\ id'
def get_queryset(自我):
通过
def创建(self、request、*args、**kwargs):
data=request.data
model=ItemModel.objects.get(item\u id=data[“model”])
item_version=ItemVersion.objects.create(
#模型=模型,
item\u ver\u id=数据[“item\u ver\u id”],
配置=数据[“配置”],
项目版本=数据[“项目版本”],
会话id=数据[“会话id”]
#完成=数据[“完成”]
)
项目\版本.模型.添加(模型)
如果数据[“已完成”]否则为假,则为真
项目\版本。完成。添加(完成)
item_version.save()
序列化程序=项目版本序列化程序(项目版本)
返回响应(数据)
出于某种原因,我不断得到外键约束失败
,并且会话id=data[“会话id”]
行突出显示为附近出现问题的那一行
有什么办法解决这个问题吗
编辑:回溯:
Traceback (most recent call last):
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py", line 383, in execute
return Database.Cursor.execute(self, query, params)
sqlite3.IntegrityError: FOREIGN KEY constraint failed
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/rest_framework/viewsets.py", line 116, in view
return self.dispatch(request, *args, **kwargs)
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/rest_framework/views.py", line 495, in dispatch
response = self.handle_exception(exc)
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/rest_framework/views.py", line 455, in handle_exception
self.raise_uncaught_exception(exc)
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/rest_framework/views.py", line 492, in dispatch
response = handler(request, *args, **kwargs)
File "/home/aqv/workspace/django_rest_fw/ct_test/core/views.py", line 47, in create
session_id=data["session_id"]
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/django/db/models/manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/django/db/models/query.py", line 422, in create
obj.save(force_insert=True, using=self.db)
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/django/db/models/base.py", line 741, in save
force_update=force_update, update_fields=update_fields)
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/django/db/models/base.py", line 779, in save_base
force_update, using, update_fields,
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/django/db/models/base.py", line 870, in _save_table
result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/django/db/models/base.py", line 908, in _do_insert
using=using, raw=raw)
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/django/db/models/manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/django/db/models/query.py", line 1186, in _insert
return query.get_compiler(using=using).execute_sql(return_id)
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1332, in execute_sql
cursor.execute(sql, params)
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/django/db/backends/utils.py", line 99, in execute
return super().execute(sql, params)
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/django/db/backends/utils.py", line 67, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/django/db/backends/utils.py", line 76, in _execute_with_wrappers
return executor(sql, params, many, context)
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/django/db/utils.py", line 89, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/home/aqv/workspace/django_rest_fw/ct_test/environ/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py", line 383, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: FOREIGN KEY constraint failed
我看到的唯一外键是那里的
model
,在代码中没有传递它
def create():
model = ItemModel.objects.get(item_id=data["model"])
item_version = ItemVersion.objects.create(
# model=model,
...
如果由于以下原因,未传递有效的模型实例或id,这将导致FK约束问题:
default=0
ItemModel
model
为空,则可以将其添加到FK定义中:
class ItemVersion(models.Model):
...
model = models.ForeignKey(ItemModel, null=True, on_delete=CASCADE)
稍后我看到您有以下两行:
item\u version.model.add()
李>项目\u版本。完成。添加(完成)
add()
不适用于布尔模型字段,FK的.add()
仅对多对多FK有效,此处不使用。在注释掉的部分中传递它们的方式很好
您可以通过以下方式获得“完成”标志的默认值:
data.get('finished', False)
# this will throw a KeyError if "finished" isn't in the dict
True if data["finished"] else False
# this will not throw an error (but doesn't check the value of finished)
True if "finished" in data else False
其他一些注意事项:
1) 您使用的是内部没有元类的。考虑使用标准串行化器,如果你真的想手工完成,或者读模型序列化程序。如果正确使用,则不需要在视图集中使用自定义的创建方法
2) default=
在FK上不是个好主意。FK通常不应该有默认值(尽管在某些情况下,FK的值是nice,比如常量表中的预定义系统数据)
3) 您没有在
create
方法中使用序列化程序。您正在直接访问request.data。这将不允许您进行验证,也不允许您说finished=BooleanField(default=False)
并始终获取序列化程序的值。已验证的_数据['finished']
我看到的唯一外键是model
,在代码中您没有传递它
def create():
model = ItemModel.objects.get(item_id=data["model"])
item_version = ItemVersion.objects.create(
# model=model,
...
如果由于以下原因,未传递有效的模型实例或id,这将导致FK约束问题:
default=0
ItemModel
model
为空,则可以将其添加到FK定义中:
class ItemVersion(models.Model):
...
model = models.ForeignKey(ItemModel, null=True, on_delete=CASCADE)
稍后我看到您有以下两行:
item\u version.model.add()
李>项目\u版本。完成。添加(完成)
add()
不适用于布尔模型字段,FK的.add()
仅对多对多FK有效,此处不使用。在注释掉的部分中传递它们的方式很好
您可以通过以下方式获得“完成”标志的默认值:
data.get('finished', False)
# this will throw a KeyError if "finished" isn't in the dict
True if data["finished"] else False
# this will not throw an error (but doesn't check the value of finished)
True if "finished" in data else False
其他一些注意事项:
1) 您使用了一个没有元类的