【问题标题】:The `.create()` method does not support writable nested fields by default`.create()` 方法默认不支持可写嵌套字段
【发布时间】:2019-07-22 09:08:43
【问题描述】:

我是 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,但对我没有帮助。

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

【问题讨论】:

  • 您不能通过perform_create 中的嵌套json 来创建新条目。只传递外键的id
  • 查看您的 json 结构,我认为您正在尝试做的是多对多关系。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-05-14
    • 2020-11-25
    • 2018-03-27
    • 2021-07-09
    • 1970-01-01
    • 2014-12-24
    • 2017-12-09
    • 2010-12-04
    • 2016-07-03
    相关资源
    最近更新 更多