【问题标题】:POST on ModelViewSet with nested object Django Rest Framework使用嵌套对象 Django Rest Framework 在 ModelViewSet 上发布
【发布时间】:2019-01-13 13:21:18
【问题描述】:

我正在使用 django rest 框架构建一个 API。我有这些模型:

class Organisme(models.Model):
    nom = models.CharField(max_length=255)
    adresse = models.ForeignKey(Adresse, on_delete=models.CASCADE)

class Adresse(models.Model):
    rue = models.CharField(max_length=255, blank=True)

这是我的模式 Organisme 的视图:

class OrganismeViewSet(viewsets.ModelViewSet):
    queryset = Organisme.objects.all()
    serializer_class = OrganismeSerializer
    pagination_class = StandardResultsSetPagination
    filter_backends = (filters.SearchFilter, DjangoFilterBackend)
    filter_class = OrganismeFilter
    search_fields = ('nom')

还有我的序列化器:

class OrganismeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Organisme
        fields = '__all__'
        depth = 1

所以我正在尝试通过发送以下内容来创建一个新的有机体

{
    "adresse": {
        "rue": "test"
    },
    "nom":"TestTest",
}

{
    "adresse": pk_id,
    "nom":"TestTest",
}

但我总是以这个错误结束:

IntegrityError at /organismes/
(1048, "Column 'adresse_id' cannot be null")

如果你们知道如何继续...提前谢谢。

【问题讨论】:

    标签: python django post django-models django-rest-framework


    【解决方案1】:

    你需要重写create 方法来生成writable nested serializer

    class AddressSerializer(serializers.ModelSerializer):
        class Meta:
            model = Addresse
            fields = ('rue',)
    
    class OrganismeSerializer(serializers.ModelSerializer):
        addresse = AddressSerializer()
    
        class Meta:
            model = Organisme
            fields = '__all__'
    
        def create(self, validated_data):
            address_data = validated_data.pop('adresse')
            address = Adresse.objects.create(**address_data)
            organism = Organisme.objects.create(address=address, **validated_data)
            return organism 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-09
      • 1970-01-01
      • 2017-12-29
      • 1970-01-01
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多