【问题标题】:Django writable nested serializers, create method not workingDjango可写嵌套序列化程序,创建方法不起作用
【发布时间】:2022-01-10 17:34:42
【问题描述】:

我有一个嵌套的序列化程序,create 方法不起作用。我在互联网上搜索过,没有任何方法对我有用。最受欢迎的是下面列出的一种。

models.py



class Displays(models.Model):
    id = models.CharField(primary_key=True, max_length=32,
                          default=generate_uuid)
    name = models.CharField(max_length=45, blank=True, null=True)


class OrdersDj(models.Model):
    id = models.CharField(primary_key=True, max_length=32,
                          default=generate_uuid)

class AdsDj(models.Model):
    id = models.CharField(primary_key=True, max_length=32,
                          default=generate_uuid)
    order = models.ForeignKey(
        OrdersDj, on_delete=models.CASCADE, blank=False, null=True)
    display = models.ForeignKey(
        Displays, on_delete=models.CASCADE, blank=True, null=True)

序列化器.py


class DisplaySerializer(serializers.ModelSerializer):

    class Meta:
        model = Displays
        fields = "__all__"

class AdsSerializer(serializers.ModelSerializer):

    display = DisplaySerializer()

    def create(self, validated_data):
        print("validated_data", validated_data)
        display_id = validated_data.pop('display')
        display = Displays.objects.get(id=display_id)
        ad = Displays.objects.create(display=display, **validated_data)
        return ad

    class Meta:
        model = Ads
        fields = "__all__"


class OrderSerializer(serializers.ModelSerializer):

    ads = AdsSerializer(source="adsdj_set", many=True)

    def create(self, validated_data):
        validated_data.pop('adsdj_set')
        order = Orders.objects.create(**validated_data)
        return order

    class Meta:
        model = Orders
        fields = "__all__"

views.py

class AdsCreate(APIView):

    def put(self, request):
        print('request.data', request.data)
        serializer = serializers.AdsSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            print('serializer.data > serializer.valid', serializer.data)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        print('serializer.errors > serializer.invalid', serializer.errors)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

打印输出

request.data <QueryDict: {'order': ['18bb2225cf6e407a943f2941072d06de'], 'display': ['91'], 'firstday': ['2021-12-4'], 'lastday': ['2021-12-21'], 'duration': ['17'], 'filetype': ['image/png'], 'originalname': ['Picture1.png'], 'price': ['2550'], 'status': ['0'], 'filehash': ['not available yet'], 'orderByNum': ['-1'], 'imgWidth': ['1061'], 'imgHeight': ['708'], 'image': [<InMemoryUploadedFile: Picture1.png (image/png)>]}>

serializer.errors > serializer.invalid {'display': [ErrorDetail(string='This field is required.', code='required')]}

我将display 字段提供给作为显示器ID 的序列化程序。在 create 方法中,我发现该显示并在新的 ad 对象中引用它。显示字段存在于request.data 中并传递给序列化程序,序列化程序抱怨display 字段不存在。

发送json数据的一种版本

{"order":"18bb2225cf6e407a943f2941072d06de","display":{"id":91},"firstday":"2021-12-5","lastday":"2021-12-15","duration":11,"image":{},"filetype":"image/png","originalname":"Picture1.png","price":1650,"status":0,"filehash":"not available yet","orderByNum":-1,"imgWidth":1061,"imgHeight":708}

【问题讨论】:

    标签: python django serialization django-rest-framework django-serializer


    【解决方案1】:

    对于display 字段,AdsSerializer 需要以下结构;

    "display": {"id": 91}
    

    而你发送这个;

    "display": 91
    

    【讨论】:

    • display[id]': ['91'] in request.data 并抛出相同的错误
    • 你能显示Display Serializer吗?
    • 您可以分享您发送的 JSON 格式的请求正文吗?
    • @Rvector 检查更新的问题
    【解决方案2】:

    尝试使用不同的序列化程序进行创建和表示。

    class AdsCreateSerializer(serializers.ModelSerializer):
    
        class Meta:
            model = Ads
            fields = "__all__"
    
    class AdsSerializer(serializers.ModelSerializer):
    
        display = DisplaySerializer()
    
        class Meta:
            model = Ads
            fields = "__all__"
    

    【讨论】:

    • 当我创建一个新广告时,我想将创建的广告与展示展示一起返回。这样,广告创建时显示为空。
    • 然后你必须创建一个嵌套的可写序列化器。
    猜你喜欢
    • 2020-07-07
    • 2023-03-24
    • 2018-11-12
    • 2019-10-13
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多