Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.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
使用序列化程序Django(DRF)创建对象_Django_Django Rest Framework_Django Serializer - Fatal编程技术网

使用序列化程序Django(DRF)创建对象

使用序列化程序Django(DRF)创建对象,django,django-rest-framework,django-serializer,Django,Django Rest Framework,Django Serializer,我正在尝试使用序列化程序在视图中创建对象。 但是,我的一个对象有一个恼人的问题: 以下是我创建对象的方式: editObject=问题\u编辑( 问题, description='CREATE Question:%s'%Question.text, 编辑器=用户, 注释=问题注释 ) 打印(编辑对象)#返回“问题”(编辑对象(无)) serializer=Question\u editSerializer(editObject) json=JSONRenderer().render(serial

我正在尝试使用序列化程序在视图中创建对象。 但是,我的一个对象有一个恼人的问题:

以下是我创建对象的方式:

editObject=问题\u编辑(
问题,
description='CREATE Question:%s'%Question.text,
编辑器=用户,
注释=问题注释
)
打印(编辑对象)#返回“问题”(编辑对象(无))
serializer=Question\u editSerializer(editObject)
json=JSONRenderer().render(serializer.data)
stream=io.BytesIO(json)
data=JSONParser().parse(流)
序列化程序=问题\u编辑序列化程序(数据=数据)
serializer.is\u有效(raise\u exception=True)
serializer.save()
这是我的
问题\u editSerializer

类问题\u editSerializer(serializers.ModelSerializer):
时间\u自\u编辑=序列化程序。SerializerMethodField()
类元:
模型=问题\编辑
fields=“\uuuu all\uuuuuu”
def get_time_自编辑以来(自我、对象):
date\u edit=object.date
time_delta=timesince(日期编辑,时区.now())
返回时间δ
def创建(自我验证的_数据):
返回问题\u编辑.objects.create(**已验证的\u数据)
和我的
问题\u编辑
模型:

课堂问题\u编辑(models.Model):
日期=型号。日期时间字段(自动\u现在\u添加=真)
问题=models.ForeignKey(问题,on_delete=models.CASCADE)
description=models.TextField(最大长度=500)
编辑器=models.ForeignKey(
CustomUser,on_delete=models.SET_NULL,NULL=True)
notes=models.TextField(最大长度=500,空白=True,空=True)
由于在上面的第一段代码中尝试使用序列化程序创建对象,因此出现以下错误:

  File "/foodbook24-api/questions/api/serializers.py", line 44, in get_time_since_edit
    time_delta = timesince(date_edit, timezone.now())
  File "/usr/local/lib/python3.8/site-packages/django/utils/timesince.py", line 49, in timesince
    d = datetime.datetime(d.year, d.month, d.day)

Exception Type: AttributeError at /api/questionnaires/
Exception Value: 'NoneType' object has no attribute 'year'
完全回溯:

Environment:


Request Method: POST
Request URL: http://localhost:8000/api/questionnaires/

Django Version: 3.1.3
Python Version: 3.8.6
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.sites',
 'rest_framework',
 'rest_framework.authtoken',
 'drfpasswordless',
 'allauth',
 'allauth.account',
 'allauth.socialaccount',
 'rest_auth',
 'rest_auth.registration',
 'django_filters',
 'corsheaders',
 'surveys',
 'questionnaire',
 'questions',
 'users',
 'foods',
 'utilities']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'corsheaders.middleware.CorsMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/usr/local/lib/python3.8/site-packages/django/core/handlers/base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/local/lib/python3.8/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/rest_framework/views.py", line 509, in dispatch
    response = self.handle_exception(exc)
  File "/usr/local/lib/python3.8/site-packages/rest_framework/views.py", line 469, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/usr/local/lib/python3.8/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
    raise exc
  File "/usr/local/lib/python3.8/site-packages/rest_framework/views.py", line 506, in dispatch
    response = handler(request, *args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/rest_framework/generics.py", line 242, in post
    return self.create(request, *args, **kwargs)
  File "/foodbook24-api/questionnaire/api/views.py", line 184, in create
    return self.elaborateClientPOSTRequest(request)
  File "/foodbook24-api/questionnaire/api/views.py", line 114, in elaborateClientPOSTRequest
    self.create_question_edit_record(questionObject, request)
  File "/foodbook24-api/questionnaire/api/views.py", line 85, in create_question_edit_record
    json = JSONRenderer().render(serializer.data)
  File "/usr/local/lib/python3.8/site-packages/rest_framework/serializers.py", line 548, in data
    ret = super().data
  File "/usr/local/lib/python3.8/site-packages/rest_framework/serializers.py", line 246, in data
    self._data = self.to_representation(self.instance)
  File "/usr/local/lib/python3.8/site-packages/rest_framework/serializers.py", line 515, in to_representation
    ret[field.field_name] = field.to_representation(attribute)
  File "/usr/local/lib/python3.8/site-packages/rest_framework/fields.py", line 1870, in to_representation
    return method(value)
  File "/foodbook24-api/questions/api/serializers.py", line 44, in get_time_since_edit
    time_delta = timesince(date_edit, timezone.now())
  File "/usr/local/lib/python3.8/site-packages/django/utils/timesince.py", line 49, in timesince
    d = datetime.datetime(d.year, d.month, d.day)

Exception Type: AttributeError at /api/questionnaires/
Exception Value: 'NoneType' object has no attribute 'year'

我在这里遗漏了什么?

在下面的代码中,您忘记保存
editObject

editObject = Question_edit(
    question=question,
    description='CREATE Question: %s' % question.text,
    editor=user,
    notes=question.notes
)
print(editObject)      # return 'Question_edit object (None)'

serializer = Question_editSerializer(editObject)
json = JSONRenderer().render(serializer.data)
stream = io.BytesIO(json)
data = JSONParser().parse(stream)
serializer = Question_editSerializer(data=data)
serializer.is_valid(raise_exception=True)
serializer.save()
只有当对象保存到数据库时,Django才会计算日期并将其存储在
editObject.date
中。由于没有发生这种情况,只要访问上面的
序列化程序.data
,您的
get\u time\u-Since\u edit()
方法就会尝试计算
None
timezone.now()
,导致错误
'NoneType'对象没有属性'year'

您可以通过将上述代码更改为以下代码来解决此问题:

editObject = Question_edit(
    question=question,
    description='CREATE Question: %s' % question.text,
    editor=user,
    notes=question.notes
)

editObject.save() # This will populate the `date` attribute with the current date/time

serializer = Question_editSerializer(editObject)
json = JSONRenderer().render(serializer.data)
stream = io.BytesIO(json)
data = JSONParser().parse(stream)
serializer = Question_editSerializer(data=data)
serializer.is_valid(raise_exception=True)
serializer.save()

在以下代码中,您忘记保存
editObject

editObject = Question_edit(
    question=question,
    description='CREATE Question: %s' % question.text,
    editor=user,
    notes=question.notes
)
print(editObject)      # return 'Question_edit object (None)'

serializer = Question_editSerializer(editObject)
json = JSONRenderer().render(serializer.data)
stream = io.BytesIO(json)
data = JSONParser().parse(stream)
serializer = Question_editSerializer(data=data)
serializer.is_valid(raise_exception=True)
serializer.save()
只有当对象保存到数据库时,Django才会计算日期并将其存储在
editObject.date
中。由于没有发生这种情况,只要访问上面的
序列化程序.data
,您的
get\u time\u-Since\u edit()
方法就会尝试计算
None
timezone.now()
,导致错误
'NoneType'对象没有属性'year'

您可以通过将上述代码更改为以下代码来解决此问题:

editObject = Question_edit(
    question=question,
    description='CREATE Question: %s' % question.text,
    editor=user,
    notes=question.notes
)

editObject.save() # This will populate the `date` attribute with the current date/time

serializer = Question_editSerializer(editObject)
json = JSONRenderer().render(serializer.data)
stream = io.BytesIO(json)
data = JSONParser().parse(stream)
serializer = Question_editSerializer(data=data)
serializer.is_valid(raise_exception=True)
serializer.save()