【问题标题】:from_db_value() takes 4 positional arguments but 5 were given Djangofrom_db_value() 接受 4 个位置参数,但 Django 给出了 5 个
【发布时间】: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


【解决方案1】:

TL;DR:

很可能,jsonfield 包与Django==1.11.18 不兼容


详情

您在 1.11.18 版本中使用 Django,它需要 5 个位置参数用于 from_db_value 方法并且不支持 JSONFields。

您也在使用django-notifications 包,它在内部使用jsonfield&gt;=1.0.3 包。因为没有最大值。版本集,django-notifications 使用最新版本的jsonfield 包。

jsonfield 的最新版本(3.0.0 及更高版本)不支持 2.2 以下的 Django。原因之一是它只需要 4 个参数而不是 5 个。

支持Django 1.11的jsonfield的最高版本是jsonfield==2.1.1

请检查已安装的jsonfield 软件包的版本(仅当您在unix 系统上时使用grep):

pip freeze | grep jsonfield

如果是 3.0.0 或更高版本,您可以尝试将其降级到 2.1.1。请注意,它可能(也可能不会)导致与其他软件包的其他兼容性问题。

【讨论】:

  • 啊,正是 jsonfield 版本,我已经将它从 3.1.0 降级到 3.0.0,它就像一个魅力,你让我的一周成为了 Michal,谢谢你
【解决方案2】:

我遇到了同样的错误:

  File "/home/django/lee3/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 833, in apply_converters
    value = converter(value, expression, self.connection, self.query.context)
TypeError: from_db_value() takes 4 positional arguments but 5 were given

它抱怨的'from_db_value' 位于/picklefield/fields.py

更改了第 184 行: def from_db_value(self, value, expression, connection): 至: def from_db_value(self, value, expression, connection, context=None): 现在一切正常。

【讨论】:

    猜你喜欢
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 2018-09-20
    • 1970-01-01
    • 2019-12-07
    相关资源
    最近更新 更多