【发布时间】:2020-07-02 16:55:52
【问题描述】:
我有一个简单的 django 通知表,结构如下
+-------------------------------+--------------+------+-----+---------+----------------+
| 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)})
因此视图的序列化器是这样的:
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
我找不到这个 from_db_value() 函数
我真的很难解决这个问题,而且我只知道有关 Django 的基础知识
我正在使用
- django : 1.11.18
- djangorestframework : 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
【问题讨论】:
-
你使用什么版本的 Django 和 Django Rest Framework?什么数据库?
-
谢谢你,我已经更新了我的帖子
-
您是否使用了非标准字段? JSONField、ArrayField 或 GeometryField 或任何其他处理比字符串、日期、整数或浮点数更复杂的数据结构的字段?我猜是不同库的版本不匹配
-
如果您获得错误的整个回溯,这可能会很有用。您可以在捕获的异常中使用
print(traceback.format_exc())获取回溯。使用import traceback导入 -
感谢您的评论@MichałS。我已经编辑了我的帖子并添加了回溯,关于我使用默认通知表的非标准字段,我认为它有一个 JSONField
标签: django django-rest-framework