2014-11-13 15 views
10

Sto costruendo un'API Web REST utilizzando il framework Rango di Django. Le cose stanno andando alla grande, ma io, comunque, mi sono imbattuto in un problema con le risorse annidate. All'inizio, tutte le relazioni nell'API REST erano collegate tramite hyperlink. Un post, per esempio, si presentava così:Django REST Framework: quando creare una risorsa con collegamenti ipertestuali e una risorsa nidificata? Come postare una risorsa nidificata?

{ 
    "path": "http://api.myproject.com/posts/1.json", 
    "id": 1, 
    "author": "http://api.myproject.com/users/broak.json", 
    "image": "/images/posts/cxyUzlPo.jpg", 
    "header": "Who am I?", 
    "footer": "I am a champion!", 
    "date": "2014-11-09 15:16", 
    "likes": "http://api.myproject.com/posts/1/likes.json", 
    "comments": "http://api.myproject.com/posts/1/comments.json", 
    "likes_count": 0, 
    "comments_count": 0 
} 

Il rapporto tra il palo e l'autore (utente) si è stati rinviati. Quando si desidera creare un nuovo post, è necessario specificare un collegamento ipertestuale corretto per un utente specifico: questo funziona correttamente.

Quando si chiama un elenco di post, le cose diventano inefficienti, perché è necessario effettuare una chiamata API aggiuntiva per ogni autore per ogni post. Ho risolto questo problema utilizzando risorse NESTED anziché risorse HYPERLINKED, quindi ogni post contiene ora tutte le informazioni sull'autore.

{ 
    "path": "http://api.myproject.com/posts/1.json", 
    "id": 1, 
    "author": { 
     "email": "[email protected]" 
     "username": "broak", 
     "first_name: "John", 
     "last_name": "Broak", 
     "is_staff": False, 
     "is_active": True, 
     "last_login": "02-26-2016" 
    }, 
    "image": "/images/posts/cxyUzlPo.jpg", 
    "header": "Who am I?", 
    "footer": "I am a champion!", 
    "date": "2014-11-09 15:16", 
    "likes": "http://api.myproject.com/posts/1/likes.json", 
    "comments": "http://api.myproject.com/posts/1/comments.json", 
    "likes_count": 0, 
    "comments_count": 0 
} 

mia prima domanda è: avete una linea guida, se devo creare una struttura dati nidificato o un endpoint separato con collegamento ipertestuale ad esso.

La mia seconda domanda è: quando uso autore come risorsa nidificata e voglio creare un nuovo post, non voglio specificare tutte le informazioni sull'autore (nome utente, e-mail, ...). Esiste un modo per utilizzare semplicemente un collegamento a un utente per l'operazione CREATE/UPDATE? O modificare qualcosa in modo che l'ID utente sia sufficiente per compilare questo campo?

risposta

7

Se ho capito correttamente la tua domanda, vuoi avere un autore espanso mentre stai recuperando i dati e vuoi solo inviare ID o URL in caso di aggiornamento e creazione.

1# Non si tratta di alcuna linea guida e dipende totalmente dalle vostre esigenze di come sarà utilizzato il vostro api.

2# Quindi è necessario estendere il UserSerializer e sostituire to_internal_value. Codice di esempio potrebbe essere simile

class MyCustomSerializer(UserSerializer): 
    def to_internal_value(self, data): 
     # data must be valid user-detail url 
     return serializers.HyperLinkedRelatedField(queryset=User.objects.all(), view_name='user-detail').to_internal_value(data) 

Avviso che è necessario disporre di un endpoint per l'utente-dettaglio in grado di lavorare con HyperLinkedRelatedField.

Quindi, se si vuole essere in grado di inviare ID poi il codice di esempio potrebbe essere simile

class MyCustomSerializer(UserSerializer): 
    # data must be valid user id 
    def to_internal_value(self, data): 
     return serializers.PrimaryKeyRelatedField(queryset=User.objects.all()).to_internal_value(data) 

Tuttavia vorrei per mantenere la coerenza nel campo invio ForeignKey in POST/PUT/PATCH. (Sempre URL o ID).

quindi utilizzare nel codice come

class PostSerializer(serializers.HyperlinkedModelSerializer): 
    author = MyCustomSerializer() 

    class Meta: 
     model = Post 

Si prega di consultare la documentazione sul Writable nested serializers-POST su una risorsa nidificato.

Problemi correlati