2017-10-18 7 views
0

Neu bei DRF 3.7.1 und ich bin ein Problem beim Versuch, ein Objekt mit einem Fremdschlüssel mit POST zu erstellen. Das Szenario ist, ich habe ein Student - Schulmodell (eine Schule hat viele Schüler) - Beispiel unten:Erstellen eines Datensatzes mit Fremdschlüssel 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') 

Der Serializer wie folgt aussieht:

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') 

Unter der Annahme, eine Schule existiert (school_id = 'ABC') ich versuche, diese JSON zu schreiben einen Schüler zu erstellen:

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

aber ich erhalte die Fehlermeldung:

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.

Nicht sicher, wie man das repariert - was soll ich für den Fremdschlüssel der Schule referenzieren?

Vielen Dank im Voraus

Antwort

0

Sie müssen eine explizite create Methode zu schaffen, wie DRF dies standardmäßig nicht für Sie tun. Zum Beispiel:

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) 
Verwandte Themen