2016-11-02 7 views
1

Mit dem Django Rest Framework versuche ich über POST ein Modellobjekt hinzuzufügen, das die ID eines vorhandenen Objekts angibt, für das das neue Objekt einen Fremdschlüssel haben soll. Funktioniert. Wenn ich dem Serialisierer des neuen Objekts jedoch eine Tiefe = 1 hinzufüge, damit ich das Fremdschlüsselziel in einem GET erhalte, schlägt der POST zum Hinzufügen eines neuen Objekts mit einem Mysql-Fehler 'IntegrityError: (1048,' column 'reportdefinition_id' nicht bin null ") ', obwohl ich eine gültige Fremdschlüssel-ID in meinem POST angegeben habe.Django Rest Framework Objekt mit Fremdschlüssel und Tiefe hinzufügen = 1

Ich kann umgehen, indem Sie die Tiefe = 1 verlassen und die Berichtsdefinition getrennt in meinem Client abrufen, aber das ist umständlich.

(fand ich zwei ähnliche Fragen, aber keine Antworten Mine: Django REST - Create object with foreign key using serializers Need to show Foreign Key Object in Details by Django Rest Framework)

Modelle (Ich habe nicht irrelevant Felder angezeigt):

class ReportDefinition(models.Model): 
    name = models.CharField(max_length=254, blank=True, null=True) 

class ReportRun(models.Model): 
    status = models.IntegerField(default=2) 
    reportdefinition = models.ForeignKey(ReportDefinition) 

Serializer:

class ReportDefinitionSerializer(serializers.ModelSerializer): 
    id = serializers.ReadOnlyField() 
    class Meta: 
     model = models.ReportDefinition 
     fields = ("id","name") 

class ReportRunSerializer(serializers.ModelSerializer): 
    id = serializers.ReadOnlyField() 
    class Meta: 
     depth = 1 
     model = models.ReportRun 
     fields =("id","status","reportdefinition") 

Wenn ich 'Tiefe = 1' entferne, funktioniert der POST.

class ReportRunSerializer(serializers.ModelSerializer): 
    id = serializers.ReadOnlyField() 
    class Meta: 
     model = models.ReportRun 
     fields =("id","status","reportdefinition") 

Die POST Inhalte (auch hier irrelevant andere Attribute nicht angezeigt):

reportdefinition:1 

Eine Sache habe ich bemerkt: ohne die Tiefe = 1, die DRF durchsuchbaren API "Report" in seinem Standard zeigt, aber mit Tiefe = 1, tut es nicht. Ich muss es explizit hinzufügen.

DRF browsable API-Gehalt mit der Tiefe = 1:

{ 
    "status": null, 
} 

(I add "Report": 1, wenn der POST die Ausgabe, und verifizieren, dass es Chrome Developer Tools verwenden erscheint)

DRF browsable API Inhalt ohne 'depth = 1':

{ 
    "status": null, 
    "reportdefinition": null 
} 

(I 1 mit null ersetzen, wenn die Ausgabe von POST)

Antwort

0

Die Frage ist ziemlich alt, aber als niemand antwortete und wie ich das gleiche Problem hatte.

In der Tat liegt die Antwort in den release note der Version 3.0:

If you define a depth, you now have to write your own create and update methods that will handle the modification of the nested fields.

Link zu documentation.

Verwandte Themen