Обновите m2m, поле foreignkey для модели не работает в DRF - PullRequest
0 голосов
/ 17 июня 2020

Обновление до следующей модели новостей не работает в DRF. (Адрес не обновляется) Создание работает нормально.

class News (models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=20)
    text = models.TextField()
    group_address = models.ManyToManyField(Group, blank=True)
    user_address = models.ForeignKey(User, on_delete=models.CASCADE)


class Group(models.Model):
    id = models.AutoField(primary_key=True)
    group_name = models.CharField(max_length=20)

class User(models.Model):
    id = models.AutoField(primary_key=True)
    user_name = models.CharField(max_length=20)

class NewsSerializerViewSet(viewsets.ModelViewSet):
    queryset = News.objects.all() 
    serializer_class = NewsSerializer 

class NewsSerializer(serializers.ModelSerializer):
    class Meta:
        model = News
        fields = '__all__'

1 Ответ

0 голосов
/ 17 июня 2020

DRF не поддерживает обновление полей m2m. попробуйте переопределить метод обновления сериализатора.

Например:

    from rest_framework.fields import empty

    class NewsSerializer(serializers.ModelSerializer):
        def __init__(self, instance=None, data=empty, **kwargs):
            self.original_data = data
            super().__init__(instance, data, **kwargs)

        def update(self, instance, validated_data):
            items_dict = self.original_data
            if 'group_address' in items_dict:
                ids = [item['id'] for item in items_dict['group_address']]

                instance_data = instance.group_address
                instance_data.set(ids)

            instance = super().update(validated_data=validated_data, instance=instance)
            instance.save()

            return instance

        class Meta:
            model = News
            fields = '__all__'
...