Обновление поля модели «многие ко многим» с использованием частичного обновления - разрешены только несвязанные и внешние ключи - PullRequest
0 голосов
/ 05 июля 2018

Я хотел бы обновить поле «многие ко многим» модели, используя частичное обновление. Однако я получаю ошибку

<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)

Теперь я хотел бы только обновить поле многие-многие (навыки), и именно так выглядит мой json

{
    "skills" :[ 
               2,4
             ]
}

где 2 и 4 - идентификаторы объектов умений, на данный момент я получаю ошибку

<django.db.models.fields.related.ManyToManyField: skills> (only non-relations and foreign keys permitted).

Есть предложения, что я могу делать неправильно и как я могу это исправить?

1 Ответ

0 голосов
/ 05 июля 2018

Вы можете сделать это в функции обновления вашего сериализатора.

Сначала вы вводите «навыки» в качестве атрибута сериализатора, который представляет собой список идентификаторов навыков. Вы могли бы назвать это как-то иначе, если вы хотите использовать тот же сериализатор для перечисления, но так как выбранное вами имя предлагает быть «частичным» сериализатором, я предполагаю, что он используется только для обновления.

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
...