web-dev-qa-db-ja.com

アサーションエラー:Django-rest-Framework

私はpython 3.4、Django 1.7.1(本で検討されているバージョン)、Postgres 9.3および私のIDE = Eclipseです。

私は "Lightweight Django-Elman and Lavin"の本を研究していて、残りのフレームワークとbackbone.jsを使用することになっている4章と5章で何日も行き詰まっています。 。たとえば、

軽量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']

このエラーは、Django-rest-frameworkに属する「relations.py」内で発生します。上記のリンクに示されている正確なコードを使用しているため、エラーは発生しないはずです。実際に、変更したコードの一部は(エラーが繰り返し発生した後)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のインストールには問題がないようです。実際、私のシステムのデータベースのリストは

                                      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

誰かが問題を発見するのを手伝ってくれる?

18

DRFのドキュメント here を読んでください。

バージョン2.xでは、ModelSerializerクラスが使用されている場合、シリアライザクラスがqueryset引数を自動的に決定することがありました。

この動作は、書き込み可能なリレーショナルフィールドに対して常に明示的なqueryset引数を使用するように置き換えられました。

使用しているコードの作成者よりも新しいバージョンのDRFを使用しているだけなので、より低いバージョンを使用するか、コードを修正する必要があります。

serializers.py には次の行があります。

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

_read_only=True_またはqueryset=User.objects.all()を追加する必要があります

41
Aldarund