2016-01-02 16 views
6

Ogni volta che definisco l'attributo depth, il campo chiave esterna dei documenti swagger nella sezione POST scompare. Sembra strano perché ho richiesto depth = 1 quando desidero dati correlati nella mia richiesta GET. Quindi non posso rimuovere questo per ottenere questo parametro di campo relativo nella sezione POST.Il campo chiave esterna scompare nei documenti swagger dopo l'aggiunta dell'attributo depth in Serializer

Ecco il caso.

Modello:

from django.db import models 
from django.conf import settings 
# Create your models here. 

User = settings.AUTH_USER_MODEL 

class Todo(models.Model): 
    user = models.ForeignKey(User) 
    title = models.CharField("Title", max_length=255) 
    completed = models.BooleanField("Completed") 

Serializer senza depth =1.

from rest_framework import serializers 
from models import Todo 

class TodoSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Todo 

uscita Swagger: enter image description here

Ora Se aggiungo depth = 1 di Swagger non visualizza campo correlati. enter image description here

Fammi sapere se qualcuno ha qualche idea su questo.

Grazie :)

risposta

0

È necessario aggiornare il serialzer come segue

class TodoSerializer(serializers.HyperlinkedModelSerializer): 
creator = serializers.RelatedField(queryset=User.objects.all()) 

class Meta: 
    model = Todo 
    fields = ("name", "task", "creator") 
    depth = 1 

è necessario menzioni campi e RelatedField nei tuoi serializzatori

+0

Grazie, fammi controllare e ti faccio sapere. – CrazyGeek

+0

Questo non funziona perché si sta dando questo errore 'RelatedField.to_representation() deve essere implementato per l'utente sul campo.Se non è necessario supportare le operazioni di scrittura, si consiglia di sottoclasse 'ReadOnlyField'.' – CrazyGeek

+0

Non voglio modificare il nome del campo perché verrà usato nella richiesta POST. – CrazyGeek

0

Finalmente dopo aver scavato in questo, vengo con soluzione con la quale possiamo evitare questo problema e raggiungere la soluzione prevista.

Quindi la soluzione è "Invece di utilizzare l'attributo depth = 1, possiamo utilizzare l'istanza di serializzazione correlata in cui funziona in modo simile alla funzionalità depth".

Qui è testato soluzione

Modello:

from django.db import models 
from django.conf import settings 

User = settings.AUTH_USER_MODEL 

class Todo(models.Model): 
    user = models.ForeignKey(User) 
    title = models.CharField("Title", max_length=255) 
    completed = models.BooleanField("Completed") 

Serializer

from rest_framework import serializers 
from django.conf import settings 
from models import Todo 

User = settings.AUTH_USER_MODEL 


class UserSerializer(serializers.HyperlinkedSerializer): 
    class Meta: 
     model = User 


class TodoSerializer(serializers.HyperlinkedModelSerializer): 
    user = UserSerializer() 

    class Meta: 
     model = Todo 
     fields = ('user', 'title', 'completed') 

Swagger uscita: enter image description here

Questa soluzione è tipo di approccio diverso al fine di ottenere la funzionalità richiesta, ma comunque mi aspetto una soluzione ufficiale del django-rest-swagger squadra, anche io ho postato la stessa query su django-resto-spavalderia github repo here.