我正在尝试更新嵌套的序列化程序,这给我一个错误的paper_description与此ID已经存在?

时间:2019-09-20 07:36:12

标签: django django-models django-rest-framework django-views

Django Rest Framework插入和更新可写的嵌套序列化程序  我尝试使用Django Rest Framework插入和更新可写的嵌套序列化程序,如下所示。但这不起作用。

我该怎么做?

控制器

class JobCardViewSet(ModelViewSet):
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated,)
    serializer_class = JobCardSerializer
    http_method_names = ('get', 'post', 'put', 'patch')

    def get_queryset(self):
        if 'key' in self.request.GET:
            key = self.request.GET['key']
            return JobCard.objects.filter(models.Q(job_order_no__icontains=key) | models.Q(job_name__icontains=key))

        if 'party' in self.request.GET:
            return JobCard.objects.filter(party_name__name__icontains=self.request.GET['party'])

        else:
            return JobCard.objects.all()

    def create(self, request, *args, **kwargs):
       self.serializer_class = JobCardPostSerializer
       return super(JobCardViewSet, self).create(request, *args, **kwargs)

    def update(self, request, *args, **kwargs):
        self.serializer_class = JobCardPostSerializer
        return super(JobCardViewSet, self).update(request, *args, **kwargs)

序列化器

我的序列化器

    class PaperDescriptionPostSerializer(ModelSerializer):
        class Meta:
            model = PaperDescription
            fields = '__all__'

     class JobCardPostSerializer(ModelSerializer):
         paper_description = PaperDescriptionPostSerializer(many=True)

         class Meta:
             model = JobCard
             fields = '__all__'


def create(self, validated_data):
    paper_description_list = validated_data.pop('paper_description')
    job_card = JobCard.objects.create(**validated_data)
    for paper in paper_description_list:
        paper.update({"party_name": job_card.party_name})
        paper.update({"job_order_no": job_card.job_order_no})
        paper.update({"job_name": job_card.job_name})
        paper.update({"job_date": job_card.job_date})
        paper.update({"job_type": job_card.job_type})
        job_card.paper_description.add(PaperDescription.objects.create(**paper))

    return job_card

def update(self, instance, validated_data):
    paper_description = validated_data.pop('paper_description')
    instance.job_name = validated_data.get("job_name", instance.job_name)
    instance.job_date = validated_data.get("job_date", instance.job_date)
    instance.delivery_date = validated_data.get("delivery_date", instance.delivery_date)
    instance.job_created_by = validated_data.get("job_created_by", instance.job_created_by)
    instance.die_no = validated_data.get("die_no", instance.die_no)
    instance.job_re_print = validated_data.get("job_re_print", instance.job_re_print)
    instance.remarks = validated_data.get("remarks", instance.remarks)
    instance.update_reason = validated_data.get("update_reason", instance.update_reason)
    instance.job_details = validated_data.get("job_details", instance.job_details)
    instance.party_name = validated_data.get("party_name", instance.party_name)
    instance.reference_id = validated_data.get("reference_id", instance.reference_id)
    instance.branch_name = validated_data.get("branch_name", instance.branch_name)

    # instance.title = validated_data.get("title", instance.title)

    instance.save()
    keep_id = []
    for choice in paper_description:
        if "id" in choice.keys():
            if PaperDescription.objects.filter(id=choice["id"]).exists():
                c = PaperDescription.objects.get(id=choice["id"])
                # c.text = choice.get('text', c.text)
                c.job_name = choice.get('job_name', c.job_name)
                c.job_date = choice.get('job_date', c.job_date)
                c.job_element = choice.get('job_element', c.job_element)
                c.thickness = choice.get('thickness', c.thickness)
                c.no_of_pages = choice.get('no_of_pages', c.no_of_pages)
                c.print_size = choice.get('print_size', c.print_size)
                c.order_qty = choice.get('order_qty', c.order_qty)
                c.no_of_ups = choice.get('no_of_ups', c.no_of_ups)
                c.print_sheets = choice.get('print_sheets', c.print_sheets)
                c.forms = choice.get('forms', c.forms)
                c.no_of_plates = choice.get('no_of_plates', c.no_of_plates)
                c.wastage_per_farma = choice.get('wastage_per_farma', c.wastage_per_farma)
                c.front_color = choice.get('front_color', c.front_color)
                c.double_single = choice.get('double_single', c.double_single)
                c.total_wastage = choice.get('total_wastage', c.total_wastage)
                c.paper_required = choice.get('paper_required', c.paper_required)
                c.back_color = choice.get('back_color', c.back_color)
                c.prints = choice.get('prints', c.prints)
                c.ruling = choice.get('ruling', c.ruling)
                c.party_name = choice.get('party_name', c.party_name)
                c.paper_type = choice.get('paper_type', c.paper_type)
                c.paper_size = choice.get('paper_size', c.paper_size)
                c.paper_brand = choice.get('paper_brand', c.paper_brand)
                c.machine_name = choice.get('machine_name', c.machine_name)

                c.save()
                keep_id.append(c.id)
            else:
                continue
        else:
            c = PaperDescription.objects.create(**choice)
            keep_id.append(c.id)

    for choice in instance.paper_description:
        if choice.id not in keep_id:
            choice.delete()

    return instance

错误

更新时 ID嵌套的对象已存在

{
    "paper_description": [
        {
            "id": [
                "paper description with this id already exists."
            ]
        },
        {
            "id": [
                "paper description with this id already exists."
            ]
        }
    ]
}

1 个答案:

答案 0 :(得分:0)

我有同样的问题。只需从id字段中删除所有验证器即可。它将为您提供帮助。

class PaperDescriptionPostSerializer(ModelSerializer):
    class Meta:
        model = PaperDescription
        fields = '__all__'
        extra_kwargs = {
            'id': {'validators': []},
        }