from_db_value()接受4个位置参数,但给了5个Django
我有一个简单的django通知表,其结构如下from_db_value()接受4个位置参数,但给了5个Django,django,django-rest-framework,Django,Django Rest Framework,我有一个简单的django通知表,其结构如下 +-------------------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------------------------+--------------+-
+-------------------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| level | varchar(20) | NO | | NULL | |
| unread | tinyint(1) | NO | | NULL | |
| actor_object_id | varchar(255) | NO | | NULL | |
| verb | varchar(255) | NO | | NULL | |
| description | longtext | YES | | NULL | |
| target_object_id | varchar(255) | YES | | NULL | |
| action_object_object_id | varchar(255) | YES | | NULL | |
| timestamp | datetime(6) | NO | | NULL | |
| public | tinyint(1) | NO | | NULL | |
| action_object_content_type_id | int(11) | YES | MUL | NULL | |
| actor_content_type_id | int(11) | NO | MUL | NULL | |
| recipient_id | int(11) | NO | MUL | NULL | |
| target_content_type_id | int(11) | YES | MUL | NULL | |
| deleted | tinyint(1) | NO | | NULL | |
| emailed | tinyint(1) | NO | | NULL | |
| data | longtext | YES | | NULL | |
我想要的就是获取内容,这就是我的观点
@api_view(['GET'])
@login_required()
def getnotifications(request, page):
try:
if page == None:
page = 1
userID = request.user
unreadnum = Notification.objects.filter(recipient=request.user,
unread=True).count()
notifs = Notification.objects.filter(recipient=userID, unread=True).distinct().order_by(
'-timestamp')
print("got ntifs")
paginator = Paginator(notifs, 10)
paginatednotifs = paginator.page(page)
return Response(
{"notifications": NotificationSerializer(paginatednotifs,many=True, context={"user": request.user}).data,
"unread": unreadnum,"has_next":paginatednotifs.has_next()})
except Exception as e:
print("========")
print(str(e))
return Response(
{"notifications": str(e)})
因此view的序列化程序如下所示:
class NotificationSerializer(serializers.ModelSerializer):
actor = serializers.SerializerMethodField()
target = serializers.SerializerMethodField()
class Meta:
model = Notification
fields = ("id","actor", "target","timestamp","verb")
def get_actor(self,obj):
user = Useraccount.objects.get(user__id=obj.actor_object_id)
return UserAccountSerializer(user,many=False,context={"user":self.context["user"]}).data
def get_target(self,obj):
if obj.target_content_type.model == "action":
action = ActstreamAction.objects.get(id=obj.target_object_id)
return ActionNotificationSerializer(action,many=False).data
return {"targetType":obj.target_content_type.model,"action":obj.action_object_content_type.model}
我试图在序列器和视图中进行许多修改,但总是出现相同的错误
from_db_value() takes 4 positional arguments but 5 were given
我无法从\u db\u value()函数中找到此
我真的很难解决这个问题,我只知道Django的基本知识
我正在使用
- django:1.11.18
- Djangorest框架:3.6.4
- mysql:5.7.25
错误的回溯:
Traceback (most recent call last):
File "<homedir>/project/webServer/app/myNotifications/views.py", line 66, in getnotifications
{"notifications": NotificationSerializer(paginatednotifs,many=True, context={"user": request.user}).data,
File "<homedir>/virtualenv/lib/python3.6/site-packages/rest_framework/serializers.py", line 739, in data
ret = super(ListSerializer, self).data
File "<homedir>/virtualenv/lib/python3.6/site-packages/rest_framework/serializers.py", line 263, in data
self._data = self.to_representation(self.instance)
File "<homedir>/virtualenv/lib/python3.6/site-packages/rest_framework/serializers.py", line 657, in to_representation
self.child.to_representation(item) for item in iterable
File "<homedir>/virtualenv/lib/python3.6/site-packages/rest_framework/serializers.py", line 657, in <listcomp>
self.child.to_representation(item) for item in iterable
File "/usr/lib/python3.6/_collections_abc.py", line 883, in __iter__
v = self[i]
File "<homedir>/virtualenv/lib/python3.6/site-packages/django/core/paginator.py", line 145, in __getitem__
self.object_list = list(self.object_list)
File "<homedir>/virtualenv/lib/python3.6/site-packages/django/db/models/query.py", line 250, in __iter__
self._fetch_all()
File "<homedir>/virtualenv/lib/python3.6/site-packages/django/db/models/query.py", line 1121, in _fetch_all
self._result_cache = list(self._iterable_class(self))
File "<homedir>/virtualenv/lib/python3.6/site-packages/django/db/models/query.py", line 62, in __iter__
for row in compiler.results_iter(results):
File "<homedir>/virtualenv/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 847, in results_iter
row = self.apply_converters(row, converters)
File "<homedir>/virtualenv/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 832, in apply_converters
value = converter(value, expression, self.connection, self.query.context)
TypeError: from_db_value() takes 4 positional arguments but 5 were given
回溯(最近一次呼叫最后一次):
文件“/project/webServer/app/myNotifications/views.py”,第66行,在getnotifications中
{“通知”:NotificationSerializer(paginatednotifs,many=True,context={“user”:request.user})。数据,
数据中的文件“/virtualenv/lib/python3.6/site packages/rest_framework/serializers.py”,第739行
ret=super(ListSerializer,self).data
文件“/virtualenv/lib/python3.6/site-packages/rest\u-framework/serializers.py”,第263行,在数据中
self.\u data=self.to\u表示(self.instance)
文件“/virtualenv/lib/python3.6/site packages/rest_framework/serializers.py”,第657行,以to_表示
iterable中项的self.child.to_表示(项)
文件“/virtualenv/lib/python3.6/site packages/rest_framework/serializers.py”,第657行,在
iterable中项的self.child.to_表示(项)
文件“/usr/lib/python3.6/\u collections\u abc.py”,第883行,在iter中__
v=自我[i]
文件“/virtualenv/lib/python3.6/site packages/django/core/paginator.py”,第145行,在__
self.object\u list=list(self.object\u list)
文件“/virtualenv/lib/python3.6/site packages/django/db/models/query.py”,第250行,在__
self._fetch_all()
文件“/virtualenv/lib/python3.6/site packages/django/db/models/query.py”,第1121行,在“获取”中
self.\u result\u cache=list(self.\u iterable\u class(self))
文件“/virtualenv/lib/python3.6/site packages/django/db/models/query.py”,第62行,在__
对于编译器中的行。结果\u iter(结果):
文件“/virtualenv/lib/python3.6/site packages/django/db/models/sql/compiler.py”,第847行,结果文件
行=自身。应用转换器(行,转换器)
文件“/virtualenv/lib/python3.6/site packages/django/db/models/sql/compiler.py”,第832行,在apply\u转换器中
value=converter(值、表达式、self.connection、self.query.context)
TypeError:from_db_value()接受4个位置参数,但给出了5个
TL;DR:
很可能,jsonfield
包与Django==1.11.18
详细信息:
您在1.11.18版中使用的是Django,它需要5个位置参数作为来自\u db\u value
方法的,并且不支持JSonfield
您还使用了django通知
包,它在内部使用jsonfield>=1.0.3
包。由于没有最大版本集,django通知
使用最新版本的jsonfield
包
最新版本的jsonfield
(3.0.0及更高版本)不支持低于2.2的Django。原因之一是它只需要4个参数,而不是5个参数
支持Django 1.11的jsonfield
的最高版本是jsonfield==2.1.1
请检查已安装的jsonfield
软件包的版本(仅当您在unix系统上时才使用grep
):
如果是3.0.0或更高版本,您可以尝试将其降级为2.1.1。请注意,它可能(或可能不会)导致与其他软件包的其他兼容性问题。我遇到了相同的错误:
文件“/home/django/lee3/lib/python3.8/site packages/django/db/models/sql/compiler.py”,第833行,在apply\u转换器中
value=converter(值、表达式、self.connection、self.query.context)
TypeError:from_db_value()接受4个位置参数,但给出了5个
它所抱怨的'from\u db\u value'
位于/picklefield/fields.py
中
更改了第184行:
def from_db_value(自我、值、表达式、连接):
致:
def from_db_value(self、value、expression、connection、context=None):
现在一切正常。您使用什么版本的Django和Django Rest框架?什么数据库?谢谢,我已经更新了我的邮件。您是否使用了任何非标准字段?JSONField、ArrayField、GeometryField或任何其他处理比字符串、日期、整数或浮点更复杂的数据结构的字段?我猜re是不同库版本中的不匹配。如果您获得错误的整个回溯,则可能会有用。您可以使用print(traceback.format_exc())获得回溯
在你捕获的异常中。使用导入回溯导入它
谢谢你的评论@MichałS。我编辑了我的帖子并添加了回溯,关于我使用默认通知表的非标准字段,我认为它有一个JSONFieldAh确切地说是jsonfield
版本,我已经将其从3降级。1.0
到3.0.0
它就像一个魔咒,你让我的一周充满魅力,迈克尔谢谢你
pip freeze | grep jsonfield