2017-10-18 4 views
0

Nouveauté de DRF 3.7.1 et je rencontre un problème en essayant de créer un objet contenant une clé étrangère en utilisant POST. Le scénario est que j'ai un étudiant - modèle scolaire (une école a beaucoup d'étudiants) - exemple ci-dessous:Création d'un enregistrement avec une clé étrangère Django Rest Framework

class School(models.Model): 
    school_id = models.CharField(primary_key=True,max_length=10) 
    school_name = models.CharField(max_length=100) 
    school_address = models.CharField(max_length=255) 
    # other fields omitted 

class Student(models.Model): 
    student_name = models.CharField(max_length=100) 
    # other fields omitted 
    school = models.ForeignKey('School') 

Le sérialiseur ressemble:

class SchoolSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = School 
     fields = ('school_id','school_name','school_address') 

class StudentSerializer(serializers.ModelSerializer): 

    school = SchoolSerializer() 

    class Meta: 
     model = Student 
     fields = ('student_name','school') 

En supposant une école existe (school_id = 'ABC') Je suis en train de poster ce JSON pour créer un étudiant:

{ 
    "student_name": "John Doe", 
    "school_id": "ABC" 
} 

mais je obtenir l'erreur:

AssertionError at /mytest/ The .create() method does not support writable nested fields by default. Write an explicit .create() method for serializer myapp.serializers.StudentSerializer , or set read_only=True on nested serializer fields.

Vous ne savez pas comment résoudre ce problème - que dois-je faire pour la clé étrangère de l'école?

Merci à l'avance

Répondre

0

Vous devez créer une méthode create explicite, comme DRF ne le fait pas pour vous par défaut. Par exemple:

class StudentSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Student 
     fields = ('student_name','school') 

    def create(self, data): 
     school, __ = School.objects.get_or_create(school_id=data["school_id"]) 
     return Student(student_name=data["student_name"], school=school)