web-dev-qa-db-fra.com

Erreur d'assertion à: Django-rest-Framework

J'utilise python 3.4, Django 1.7.1 (la version considérée dans le livre), Postgres 9.3 et mon IDE = est Eclipse.

J'ai étudié le livre "Lightweight Django - Elman and Lavin" et je suis coincé depuis des jours dans les chapitres 4 et 5, où nous sommes censés utiliser le reste du framework et backbone.js Voir par exemple,

Léger Django - Chapitres 4 et 5

Il y a quelques jours, j'ai essayé de coder par myseld comme présenté dans le livre et de vérifier également avec les exemples présentés dans le lien ci-dessus. Cependant, comme je n'allais pas de l'avant, j'ai décidé de copier le code présenté dans le lien ci-dessus et j'ai essayé de courir. La même erreur s'est produite:

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: 

Le champ relationnel doit fournir un argument queryset ou définir 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']

Cette erreur survient à l'intérieur de "relations.py, qui appartient au framework Django-rest. Puisque j'utilise le code exact présenté dans le lien ci-dessus, il est censé ne pas avoir d'erreurs. En fait, le seul morceau de code que j'ai changé était dans le fichier settings.py (après que l'erreur s'est produite à plusieurs reprises):

Avant:

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

Maintenant:

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

Comme vous pouvez le voir ci-dessous, mon utilisateur "daniel" a les attributs suivants:

Role name |                   Attributes                   | Member of | Description 
-----------+------------------------------------------------+-----------+-------------
 daniel    | Superuser, Create DB                           | {}        | 
 postgres  | Superuser, Create role, Create DB, Replication | {}        | 

Enfin, il semble que je n'ai aucun problème avec l'installation de psycopg2, puisque j'ai pu créer des "scrum" comme présenté ci-dessous. En fait, la liste des bases de données de mon système est

                                      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

Quelqu'un peut-il m'aider à découvrir le problème?

18
DanielTheRocketMan

Lisez les documents DRF ici .

Dans la version 2.x, une classe sérialiseur pouvait parfois déterminer automatiquement l'argument queryset si une classe ModelSerializer était utilisée.

Ce comportement est désormais remplacé par l'utilisation toujours d'un argument de jeu de requêtes explicite pour les champs relationnels accessibles en écriture.

Vous utilisez simplement une version plus récente de DRF que les auteurs du code utilisé, vous devrez donc utiliser une version inférieure ou corriger le code.

Dans serializers.py il y a cette ligne:

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

Vous devez ajouter read_only=True Ou queryset=User.objects.all()

41
Aldarund