默认情况下,.create()方法不支持可写的嵌套字段

时间:2019-02-28 12:36:33

标签: django python-3.x django-rest-framework foreign-keys

我是Django REST的新手,我试图使用django rest中的serilaizer进入数据库。但是使用create方法时出现一些错误。

我的模特是

class CoreInformation(models.Model):
        site_name = models.CharField(max_length=145, blank=True, null=True)
        status = models.CharField(max_length=45, blank=True, null=True)
        created_at = models.DateTimeField(blank=True, null=True, auto_now_add=True)

        class Meta:
            managed = False
            db_table = 'core_information'

class CoreDetailInformation(models.Model):
    core_info = models.ForeignKey('CoreInformation', models.DO_NOTHING, related_name='core_base_info')
    old_sac = models.CharField(max_length=45, blank=True, null=True)
    msc = models.CharField(max_length=45, blank=True, null=True)

    class Meta:
        db_table = 'core_detail_information'

我有两个像下面的ModelSerializer,

class CoreDetailSerializer(serializers.ModelSerializer):

    class Meta:
        model = CoreDetailInformation
        fields = ('id','old_sac', 'msc')


class CustomCoreInfoSerializer(serializers.ModelSerializer):
    core_base_info = CoreDetailSerializer(many=True)

    class Meta:
        model = CoreInformation
        # fields = '__all__'
        fields = ('id', 'site_name', 'status', 'created_at', 'core_base_info')

        @transaction.atomic
        def create(self, validated_data):
            try:
                with transaction.atomic():
                    base_info = CoreInformation.objects.create(site_name=validated_data['site_name'],status=validated_data['status']                                         
                    for site_detail in validated_data['core_base_info']:
                        CoreDetailInformation.objects.get_or_create(msc=site_detail['msc'],old_sac=site_detail['old_sac'],core_info=base_info)
            except CoreInformation.DoesNotExist as e:
                raise e
            except CoreDetailInformation.DoesNotExist as e:
                raise e

而我的views.py是,

class CoreInformation(generics.ListCreateAPIView):
    queryset = models.CoreInformation.objects.all()
    serializer_class = CustomCoreInfoSerializer

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        instance = self.perform_create(serializer)
        serializer = self.get_serializer(instance=instance)
        return Response(serializer.data, status=status.HTTP_201_CREATED)

    def perform_create(self, serializer):
        return serializer.create(validated_data=serializer.validated_data)

要创建CoreInformation,我的输入将如下所示,

{
    "site_name": "xxxxxxxxxx",
    "status": "create",
    "core_base_info": [{
                "old_sac": '1',
                "msc": "abc1,abc2"
            },
            {
                "old_sac": '2',
                "msc": "abc3,abc4"
            }]
}

但是当我编译它时,出现以下错误,

AssertionError at /api/core/
The `.create()` method does not support writable nested fields by default.
Write an explicit `.create()` method for serializer `src.core.serializers.CustomCoreInfoSerializer`, or set `read_only=True` on nested serializer fields.

我找到了this,但对我没有帮助。

任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

我认为您可以使用此GitHub解决您的问题  试试这个:https://github.com/beda-software/drf-writable-nested