在Django-rest-Framework中出现了断言错误。

25

我正在使用Python 3.4,Django 1.7.1(书中考虑的版本),Postgres 9.3以及我的IDE是Eclipse。

我一直在学习《轻量级Django-Elman和Lavin》这本书,并且在第4章和第5章卡住了好几天。在这些章节中,我们应该使用rest框架和backbone.js。例如,请查看:

轻量级Django-第4、5章

几天前,我尝试按照书中介绍的方式编写代码,并检查上面链接中提供的示例。然而,由于我无法前进,我决定复制上面链接中提供的代码并尝试运行。同样的错误出现了:

AssertionError at /

Relational field must provide a `queryset` argument, or set read_only=`True`.

Request Method:     GET
Request URL:    http://127.0.0.1:8000/
Django Version:     1.7.1
Exception Type:     AssertionError
Exception Value: 

关系字段必须提供一个queryset参数,或将read_only设置为True

Exception Location:     /usr/local/lib/python3.4/dist-packages/rest_framework/relations.py in __init__, line 35
Python Executable:  /usr/bin/python3
Python Version:     3.4.0
Python Path:    

['/home/daniel/workspace/Scrum',
 '/usr/lib/python3.4',
 '/usr/lib/python3.4/plat-i386-linux-gnu',
 '/usr/lib/python3.4/lib-dynload',
 '/usr/local/lib/python3.4/dist-packages',
 '/usr/lib/python3/dist-packages']

这个错误发生在“relations.py”内,它属于django-rest-framework。由于我正在使用上面链接中呈现的精确代码,所以不应该有错误。实际上,我更改的唯一代码片段是在出现错误后的“settings.py”中:

之前:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'scrum',
    }
}

现在:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'scrum',
        'USER': 'daniel', 
        'PASSWORD': '12345',
        'HOST': '127.0.0.1',
        'PORT': '5432',        
    }

正如下面所示,我的用户“daniel”具有以下属性:
Role name |                   Attributes                   | Member of | Description 
-----------+------------------------------------------------+-----------+-------------
 daniel    | Superuser, Create DB                           | {}        | 
 postgres  | Superuser, Create role, Create DB, Replication | {}        | 

最终,看起来我没有安装 psycopg2 的任何问题,因为我能够像下面展示的那样创建“scrum”。事实上,我的系统数据库列表如下:

                                      List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 scrum     | daniel   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =Tc/daniel           +
           |          |          |             |             | daniel=CTc/daniel
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres

有人能帮我找出问题所在吗?

3个回答

50
请阅读DRF文档这里

在2.x版本中,如果使用ModelSerializer类,则序列化器类有时可以自动确定查询集参数。

现在,对于可写的关系字段,该行为已经替换为始终使用显式查询集参数。

您只是使用比代码作者更高版本的DRF,因此需要使用较低版本或修复代码。

serializers.py中有这样一行:

assigned = serializers.SlugRelatedField(slug_field=User.USERNAME_FIELD, required=False)

你需要添加read_only=Truequeryset=User.objects.all()


序列化程序的链接出现了404错误。能否更新一下链接?或者提供一下是哪个序列化程序文件? - hlkstuv_23900
1
他们改变了他们的代码库。但是看起来已经修复了。https://github.com/lightweightdjango/examples/blob/chapter-6/scrum/board/serializers.py assigned = serializers.SlugRelatedField( slug_field=User.USERNAME_FIELD, required=False, queryset=User.objects.all()) - Aldarund
2
有一天,Django 将会正常工作,不再出现无意义的错误,或者有一天我将把所有使用这个有问题框架的东西迁移到 Flask。 - E.Serra

-2
在我的情况下,read_only=True 有帮助。

-3

你需要从你的序列化器中移除RelatedField,因为它在Django中已经不再支持了。在我的情况下,这个方法是行得通的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接