【发布时间】:2020-02-03 14:50:12
【问题描述】:
我有一个 SMSMessages 模型,它将包含所有发送的短信。我正在尝试通过 django-rest-framework ListCreateAPIView 类进行访问,但是当我尝试执行 OPTION 时,我一直遇到错误通过 Insomnia 请求 API,TypeError at /smsmessages/
type object argument after ** must be a mapping, not int。
我在 SO 上进行了搜索,发现了类似的错误,但它们是由 filter() 参数引起的,这不适用于此。
我正在使用 django 2.2.5、python 3.6.8、django-rest-framework 3.10.3 和 mysqlclient 1.4.4。
这是SMSMessages的型号
from django.db import models
from django.contrib.auth.models import AbstractUser
from rest_framework.authtoken.models import Token
class SMSMessages(models.Model):
sms_number_to = models.CharField(max_length=14)
sms_content = models.CharField(max_length=160)
sending_user = models.ForeignKey("SMSUser", on_delete=models.PROTECT, related_name="user_that_sent", limit_choices_to=1)
sent_date = models.DateTimeField(auto_now=True)
delivery_status = models.BooleanField(default=False)
class Meta:
verbose_name_plural = "SMSMessages"
def __str__(self):
return self.sending_user
这是 urls.py 文件:
from django.urls import path
from rest_framework.authtoken import views
from rest_framework.routers import DefaultRouter
from notification.apiviews import SMSendView, SMSMessagesView
app_name = "notification"
router = DefaultRouter()
urlpatterns = [
path("smsmessages/", SMSMessagesView.as_view(), name="sms_messages"),
]
所以我访问它的方式是向http://localhost:8000/smsmessages/ 发送一个OPTION 请求。
这是用于 api 视图的 SMSMessagesview 类:
from rest_framework import generics, status, viewsets, permissions
from rest_framework.response import Response
from rest_framework.views import APIView
from django.shortcuts import get_object_or_404, get_list_or_404
from django.contrib.auth import authenticate
from commons.models import SMSMessages
from commons.serializers import SMSMessagesSerializer
class SMSMessagesView(generics.ListCreateAPIView):
"""
This class is responsible for generating, and returning, the view for all created objects of the SMSMessages model.
It sub-classes the ListCreateAPIView class from the generics module.
"""
queryset = SMSMessages.objects.all()
if not queryset:
Response(data={"{0} not found".format(queryset)}, status=404, content_type="application/json")
serializer_class = SMSMessagesSerializer
这是错误:
TypeError at /notification/smsmessages/
type object argument after ** must be a mapping, not int
Request Method: OPTIONS
Request URL: http://localhost:8055/notification/smsmessages/
Django Version: 2.2.5
Python Executable: /home/gadd/vscodeworkspace/sms.et/api.sms.et/api_env/bin/python
Python Version: 3.6.8
Python Path: ['/home/gadd/vscodeworkspace/sms.et/api.sms.et', '/home/gadd/vscodeworkspace/sms.et/api.sms.et/api_env/lib/python36.zip', '/home/gadd/vscodeworkspace/sms.et/api.sms.et/api_env/lib/python3.6', '/home/gadd/vscodeworkspace/sms.et/api.sms.et/api_env/lib/python3.6/lib-dynload', '/usr/lib/python3.6', '/home/gadd/vscodeworkspace/sms.et/api.sms.et/api_env/lib/python3.6/site-packages']
Server time: Sat, 5 Oct 2019 16:19:59 +0000
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'rest_framework_swagger',
'rest_framework.authtoken',
'commons',
'notification']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "/home/gadd/vscodeworkspace/sms.et/api.sms.et/api_env/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
34. response = get_response(request)
File "/home/gadd/vscodeworkspace/sms.et/api.sms.et/api_env/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
115. response = self.process_exception_by_middleware(e, request)
File "/home/gadd/vscodeworkspace/sms.et/api.sms.et/api_env/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
113. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/gadd/vscodeworkspace/sms.et/api.sms.et/api_env/lib/python3.6/site-packages/django/views/decorators/csrf.py" in wrapped_view
54. return view_func(*args, **kwargs)
File "/home/gadd/vscodeworkspace/sms.et/api.sms.et/api_env/lib/python3.6/site-packages/django/views/generic/base.py" in view
71. return self.dispatch(request, *args, **kwargs)
File "/home/gadd/vscodeworkspace/sms.et/api.sms.et/api_env/lib/python3.6/site-packages/rest_framework/views.py" in dispatch
505. response = self.handle_exception(exc)
File "/home/gadd/vscodeworkspace/sms.et/api.sms.et/api_env/lib/python3.6/site-packages/rest_framework/views.py" in handle_exception
465. self.raise_uncaught_exception(exc)
File "/home/gadd/vscodeworkspace/sms.et/api.sms.et/api_env/lib/python3.6/site-packages/rest_framework/views.py" in raise_uncaught_exception
476. raise exc
File "/home/gadd/vscodeworkspace/sms.et/api.sms.et/api_env/lib/python3.6/site-packages/rest_framework/views.py" in dispatch
502. response = handler(request, *args, **kwargs)
File "/home/gadd/vscodeworkspace/sms.et/api.sms.et/api_env/lib/python3.6/site-packages/rest_framework/views.py" in options
516. data = self.metadata_class().determine_metadata(request, self)
File "/home/gadd/vscodeworkspace/sms.et/api.sms.et/api_env/lib/python3.6/site-packages/rest_framework/metadata.py" in determine_metadata
68. actions = self.determine_actions(request, view)
File "/home/gadd/vscodeworkspace/sms.et/api.sms.et/api_env/lib/python3.6/site-packages/rest_framework/metadata.py" in determine_actions
94. actions[method] = self.get_serializer_info(serializer)
File "/home/gadd/vscodeworkspace/sms.et/api.sms.et/api_env/lib/python3.6/site-packages/rest_framework/metadata.py" in get_serializer_info
111. for field_name, field in serializer.fields.items()
File "/home/gadd/vscodeworkspace/sms.et/api.sms.et/api_env/lib/python3.6/site-packages/django/utils/functional.py" in __get__
80. res = instance.__dict__[self.name] = self.func(instance)
File "/home/gadd/vscodeworkspace/sms.et/api.sms.et/api_env/lib/python3.6/site-packages/rest_framework/serializers.py" in fields
360. for key, value in self.get_fields().items():
File "/home/gadd/vscodeworkspace/sms.et/api.sms.et/api_env/lib/python3.6/site-packages/rest_framework/serializers.py" in get_fields
1047. source, info, model, depth
File "/home/gadd/vscodeworkspace/sms.et/api.sms.et/api_env/lib/python3.6/site-packages/rest_framework/serializers.py" in build_field
1182. return self.build_relational_field(field_name, relation_info)
File "/home/gadd/vscodeworkspace/sms.et/api.sms.et/api_env/lib/python3.6/site-packages/rest_framework/serializers.py" in build_relational_field
1257. field_kwargs = get_relation_kwargs(field_name, relation_info)
File "/home/gadd/vscodeworkspace/sms.et/api.sms.et/api_env/lib/python3.6/site-packages/rest_framework/utils/field_mapping.py" in get_relation_kwargs
255. limit_choices_to = models.Q(**limit_choices_to)
Exception Type: TypeError at /notification/smsmessages/
Exception Value: type object argument after ** must be a mapping, not int
这是使用的序列化程序类:
from rest_framework import serializers
from rest_framework.authtoken.models import Token
from commons.models import SMSUser, SMSPrice, Type, SMSMessages
class SMSMessagesSerializer(serializers.ModelSerializer):
"""
A class for serializing the SMSMessages model's data. It sub-classes the
ModelSerializer class from serializer's module.
"""
class Meta:
model = SMSMessages
fields = '__all__'
当我尝试通过管理界面将SMSMessages 对象添加到数据库时,也会引发同样的错误。有人可以帮忙吗?
【问题讨论】:
-
相关对象序列化错误。我想。
-
@NaveenJain 我不这么认为,我已经更新了问题并插入了序列化程序,除了它针对上述模型之外,它类似于我使用的另一个有效的模型。
标签: django python-3.x django-rest-framework typeerror