Подтвердить что ты не робот

Ошибка утверждения: Django-rest-Framework

Я использую python 3.4, Django 1.7.1 (версия, рассмотренная в книге), Postgres 9.3, а моя IDE - Eclipse.

Я изучаю книгу "Легкий Джанго - Эльман и Лавин", и я несколько дней сидел в главах 4 и 5, где мы должны использовать остальные рамки и backbone.js. См. Например,

Легкий Django - главы 4 и 5

Несколько дней назад я попытался запрограммировать myseld как представленный в книге, а также проверить примеры, приведенные в ссылке выше. Однако, поскольку я не собирался идти вперед, я решил скопировать код, указанный в ссылке выше, и попытался запустить. Возникла та же ошибка:

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. Так как я использую точный код, представленный в ссылке выше, предполагается, что он не имеет ошибок. Фактически, единственный фрагмент кода что я изменился, был в 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

Может кто-нибудь помочь мне обнаружить проблему?

4b9b3361

Ответ 1

Прочитайте документы DRF здесь.

В версии 2.x класс serializer иногда может автоматически определять аргумент запроса, если использовался класс ModelSerializer.

Теперь это поведение заменяется всегда с использованием явного аргумента запроса для записываемых реляционных полей.

Вы используете более новую версию DRF, чем авторы используемого кода, поэтому вам нужно либо использовать более низкую версию, либо исправить код.

В serializers.py есть эта строка:

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

Вам нужно либо добавить read_only=True, либо queryset=User.objects.all()