2016-02-16 17 views
5

Przede wszystkim nie chodzi o tworzenie lub aktualizowanie obiektów zagnieżdżających, ale tylko o ich ustawienie. pozwala wykorzystać następujący przykład: Mam następujące modele:Jak ustawić obiekt zagnieżdżony w strukturze repozytorium django?

class Category(models.Model): 
    code= models.CharField(max_length=2) 
    name= models.CharField(max_length=100) 

class Question(models.Model): 
    category= models.ForeignKey(Category, related_name='categories') 
    title = models.CharField(max_length=100) 

oraz następujące serializers:

class CategorySerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Category 
     fields = ('code', 'name') 

class QuestionSerializer(serializers.ModelSerializer): 
    category= CategorySerializer() 

    class Meta: 
     model = Question 
     fields = ('category', 'title') 

Teraz, kiedy getQuestion, grzywny działa zgodnie z oczekiwaniami: Mam pola zapytania z polami kategorii zgodnie z oczekiwaniami.

Problem, który mam jest, gdy chcę postQuestion tylko o Category.code, nie jestem pewien, jak skonfigurować/używać istniejącego Category. Próbowałem różnych sposobów, ale żaden z nich nie działał.

Jeśli usunąć category= CategorySerializer() na QuestionSerializer i przekazać id (pk) z Category na moją prośbę, niż to działa, Question są zapisywane z pokrewnym Category.

Czy istnieje sposób, aby wskazać, jak serializować zagnieżdżony obiekt?

Z góry dziękujemy za wszelkie uwagi/porady/rozwiązania.

+0

Możliwy duplikat [Django REST Framework: tworzenie i aktualizowanie obiektu z zagnieżdżona wartość obiektu (zamiast klucza podstawowego)] (http://stackoverflow.com/questions/35181118/django-rest-framework-create-and-update-an-object-with-a-nested-object-value-i) – bakkal

Odpowiedz

1

Nie jestem pewien, jeśli go mam. Wydaje mi się, że chodzi o stworzenie Question, prawda?

Można nadpisać metodę QuestionSerializer

class QuestionSerializer(serializers.ModelSerializer): 
    category= CategorySerializer() 

    class Meta: 
     model = Question 
     fields = ('category', 'title') 

    def create(self, validated_data): 
     category = validated_data.pop('category') 
     category_obj = Category.objects.get(code=category['code']) 

     return self.Meta.model.objects.create(category=category, **validated_date) 

create Może trzeba także ustawić pole name w CategorySerializer do read_only

+0

Powiedziałem specjalnie, że nie chodzi o tworzenie ani aktualizowanie gniazda ed obiekt w moim pierwszym zdaniu. chodzi o użycie istniejącego. –

+0

@storm_buster Taka jest ta odpowiedź (moja obejmuje oba przypadki). Tworzy nowy _Question_, ale będzie szukał istniejącej _Category_ do dołączenia do instancji Question. – bakkal

+0

@storm_buster podczas wysyłania 'danych' wywoływana jest metoda' create' serializera. Czy masz na myśli prośbę typu "PATCH/PUT"? Następnie powinieneś zrobić coś podobnego do opisanego powyżej za pomocą metody 'update'. – ilse2005