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
  • 但数据库中不存在pk=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
  • 但数据库中不存在pk=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) 您使用了一个没有元类的