2016-01-02 14 views
6

Ilekroć definiuję atrybut depth, pole klucza obcego z dokumentu dokowania w sekcji POST znika. Wydaje się to dziwne, ponieważ wymagałem depth = 1, gdy chcę mieć powiązane dane w żądaniu . Nie mogę tego usunąć, aby uzyskać powiązany parametr pola w sekcji POST.Klucz obcego pola znika w dokumentach przechwytujących po dodaniu atrybutu głębokości w Serializatorze

Oto przypadek.

Model:

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 bez depth =1.

from rest_framework import serializers 
from models import Todo 

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

wyjście Swagger: enter image description here

Teraz Jeśli dodać depth = 1 niż Swagger nie wyświetla dziedzinie pokrewnej. enter image description here

Daj mi znać, jeśli ktoś ma jakiekolwiek wskazówki na ten temat.

Dzięki :)

Odpowiedz

0

Musisz zaktualizować serialzer następująco

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

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

trzeba wspomina pól i RelatedField w swoim serializers

+0

Dzięki, Pozwól mi to sprawdzić i dam ci znać. – CrazyGeek

+0

To nie działa, ponieważ daje ten błąd. '' '' 'ReplyField.to_representation() musi być zaimplementowana dla użytkownika pola.Jeśli nie potrzebujesz obsługiwać operacji zapisu, prawdopodobnie chcesz podklasować "ReadOnlyField" zamiast. – CrazyGeek

+0

Nie chcę również zmieniać nazwy pól, ponieważ będą one używane w żądaniu POST. – CrazyGeek

0

Wreszcie po wykopaniu do tego wymyślić rozwiązanie, dzięki któremu możemy uniknąć tego problemu i osiągnąć oczekiwane rozwiązanie.

Rozwiązaniem jest "Zamiast używać atrybutu depth = 1 możemy korzystać z podobnej instancji serializera, która działa podobnie do funkcji depth".

Oto sprawdzone rozwiązanie

modelu:

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 wyjściowy: enter image description here

To rozwiązanie jest trochę inne podejście w celu osiągnięcia wymaganej funkcjonalności, ale spodziewam się oficjalnego rozwiązania z django-rest-swagger zespołu Nawet Pisałem tę samą kwerendę na django-rest-Swagger github repo here.