Django models 使用部分更新更新模型的多对多字段-仅允许非关系和外键

Django models 使用部分更新更新模型的多对多字段-仅允许非关系和外键,django-models,django-rest-framework,many-to-many,Django Models,Django Rest Framework,Many To Many,我想使用部分更新来更新模型的多对多字段。但是我得到了错误 <django.db.models.fields.related.ManyToManyField: skills> (only non-relations and foreign keys permitted). 这就是我的序列化程序的样子 class modelJob(models.Model): skills = models.ManyToManyField(modelSkill,bla

我想使用部分更新来更新模型的多对多字段。但是我得到了错误

<django.db.models.fields.related.ManyToManyField: skills> (only non-relations and foreign keys permitted).
这就是我的序列化程序的样子

class modelJob(models.Model):
    skills              = models.ManyToManyField(modelSkill,blank=True)
    title               = models.CharField(max_length=200, unique=False,blank=False,null=True)
    moreInfo            = models.CharField(max_length=500, unique=False,blank=False,null=True)
class Serializer_PartialUpdateJob_RX(serializers.ModelSerializer):
    class Meta:
        model = modelJob
        fields = '__all__'

    def update(self, instance, validated_data):
        modelJob.objects.filter(pk=instance.id).update(**validated_data)
        job = modelJob.objects.get(pk=instance.id)
        return job
class PartialUpdate_Jobs(GenericAPIView, UpdateModelMixin):
    queryset = modelJob.objects.all()
    serializer_class = Serializer_PartialUpdateJob_RX
    lookup_field = 'id'

    def put(self, request, *args, **kwargs):
        result =  self.partial_update(request, *args, **kwargs)
        return Response(Serializer_Job_TX(self.queryset[0]).data)
{
    "skills" :[ 
               2,4
             ]
}
这就是我的观点

class modelJob(models.Model):
    skills              = models.ManyToManyField(modelSkill,blank=True)
    title               = models.CharField(max_length=200, unique=False,blank=False,null=True)
    moreInfo            = models.CharField(max_length=500, unique=False,blank=False,null=True)
class Serializer_PartialUpdateJob_RX(serializers.ModelSerializer):
    class Meta:
        model = modelJob
        fields = '__all__'

    def update(self, instance, validated_data):
        modelJob.objects.filter(pk=instance.id).update(**validated_data)
        job = modelJob.objects.get(pk=instance.id)
        return job
class PartialUpdate_Jobs(GenericAPIView, UpdateModelMixin):
    queryset = modelJob.objects.all()
    serializer_class = Serializer_PartialUpdateJob_RX
    lookup_field = 'id'

    def put(self, request, *args, **kwargs):
        result =  self.partial_update(request, *args, **kwargs)
        return Response(Serializer_Job_TX(self.queryset[0]).data)
{
    "skills" :[ 
               2,4
             ]
}
现在我只想更新多个字段(技能),这就是我的json看起来的样子

class modelJob(models.Model):
    skills              = models.ManyToManyField(modelSkill,blank=True)
    title               = models.CharField(max_length=200, unique=False,blank=False,null=True)
    moreInfo            = models.CharField(max_length=500, unique=False,blank=False,null=True)
class Serializer_PartialUpdateJob_RX(serializers.ModelSerializer):
    class Meta:
        model = modelJob
        fields = '__all__'

    def update(self, instance, validated_data):
        modelJob.objects.filter(pk=instance.id).update(**validated_data)
        job = modelJob.objects.get(pk=instance.id)
        return job
class PartialUpdate_Jobs(GenericAPIView, UpdateModelMixin):
    queryset = modelJob.objects.all()
    serializer_class = Serializer_PartialUpdateJob_RX
    lookup_field = 'id'

    def put(self, request, *args, **kwargs):
        result =  self.partial_update(request, *args, **kwargs)
        return Response(Serializer_Job_TX(self.queryset[0]).data)
{
    "skills" :[ 
               2,4
             ]
}
其中2和4是技能对象的ID,此时我得到错误

<django.db.models.fields.related.ManyToManyField: skills> (only non-relations and foreign keys permitted).
(仅允许使用非关系键和外键)。

有什么建议我可能做错了什么,以及如何解决这个问题吗?

您可以在序列化程序的更新函数中完成

首先引入“skills”作为序列化程序的attributer,它是skills id的列表。如果您想使用相同的序列化程序进行列表,您可以将其称为其他名称,但正如您选择的名称所示,它是“部分”序列化程序,我假设它仅用于更新

class Serializer_PartialUpdateJob_RX(serializers.ModelSerializer):
    skills = serializers.PrimaryKeyRelatedField(queryset=modelSkill.objects.all(), write_only=True, many=True, required=False)

    def update(self, instance, validated_data):
         skills = validated_data.pop('skills', None)
         instance = super().update(instance, validated_data) # if you want to update other fields

         # now update skills 
         if skills is not None:
             for skills in skills:
                 instance.skills.add(skill)
             instance.save()

         return instance

您可以在序列化程序的更新函数中执行此操作

首先引入“skills”作为序列化程序的attributer,它是skills id的列表。如果您想使用相同的序列化程序进行列表,您可以将其称为其他名称,但正如您选择的名称所示,它是“部分”序列化程序,我假设它仅用于更新

class Serializer_PartialUpdateJob_RX(serializers.ModelSerializer):
    skills = serializers.PrimaryKeyRelatedField(queryset=modelSkill.objects.all(), write_only=True, many=True, required=False)

    def update(self, instance, validated_data):
         skills = validated_data.pop('skills', None)
         instance = super().update(instance, validated_data) # if you want to update other fields

         # now update skills 
         if skills is not None:
             for skills in skills:
                 instance.skills.add(skill)
             instance.save()

         return instance