Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.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
from_db_value()接受4个位置参数,但给了5个Django_Django_Django Rest Framework - Fatal编程技术网

from_db_value()接受4个位置参数,但给了5个Django

from_db_value()接受4个位置参数,但给了5个Django,django,django-rest-framework,Django,Django Rest Framework,我有一个简单的django通知表,其结构如下 +-------------------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------------------------+--------------+-

我有一个简单的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)})
因此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