2016-11-02 86 views
1

使用Django Rest Framework,我试图通过POST添加一个模型对象,指定新对象应该有一个外键的现有对象的ID。作品。但是,如果我将depth = 1添加到新对象的序列化程序中,以便在GET中获取外键目标,则添加新对象的POST会失败并显示mysql错误'IntegrityError:(1048,“Column'reportdefinition_id'can not即使我在我的POST中指定了一个有效的外键ID,也是null)。Django Rest Framework使用外键和深度添加对象= 1

我可以通过将depth = 1取出并在客户端单独检索reportdefinition来解决此问题,但这很麻烦。

(我发现了两个相关的问题,但是没有回答我的: Django REST - Create object with foreign key using serializers Need to show Foreign Key Object in Details by Django Rest Framework

模型(我还没有显示不相关的字段):

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) 

串行器:

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

如果我删除'深度= 1',则POST工作。

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

的POST内容(再次,不相关的其他属性未示出):

reportdefinition:1 

一件事我注意到:无需深度= 1时,DRF可浏览的API示出了在它的默认 “reportdefinition”,但是深度= 1,它不会。我必须明确地添加它。

DRF阅览API含量随深度= 1:

{ 
    "status": null, 
} 

(I增加 “reportdefinition”:1发出POST时,并验证其显示使用Chrome开发者工具)

DRF阅览API内容,因为没有 '深度= 1':

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

(I发出POST时用1代替零)

回答

0

问题是相当古老的,但没有人回应,因为我有同样的问题。

事实上,响应掌握在3.0版本的release note

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.

链接documentation

相关问题