Обновление вложенного PrimaryKeyRelatedField в Django Rest Framework - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь создать функцию обновления для одного из моих сериализаторов, который представляет Company, где некоторые люди (пользователи моего приложения) admin.Однако, когда я обращаюсь к Postman с просьбой обновить объект Company, кажется, что мой сериализатор не получает все данные i PUT в моем API.

Я пытался использовать полный сериализатор пользовательских объектов всериализатор моей компании, но в этом случае я должен указать данные, которые мне не нужны, и они даже не работают.

Когда я PUT название моей компании выглядит так:

{
    "id": 1,
    "admins": [
        5,
        6,
        7,
        9,
        11
    ],
    "name": "Mon entreprise"
}

Мой API отвечает на это (пользователи с идентификаторами 6 и 11 были добавлены с помощью панели администратора):

{
    "name": "Mon entreprise",
    "logo": "http://localhost:8000/api/companies/1/mwe.jpg",
    "admins": [
        6,
        11
    ]
}

Я попробовал это, чтобы увидеть, какие данные были переданы через API

    def update(self, instance, validated_data):
        print (validated_data)

и вывод был:

{'name': "Mon entreprise"}

Мой сериализатор:

class CompanySerializer(serializers.ModelSerializer):
    admins      = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

    class Meta:
        model = Company
        fields = ('name', 'logo', 'admins',)

    def update(self, instance, validated_data):
        print (validated_data)
        instance.logo = validated_data.get('logo', instance.logo)
        instance.name = validated_data.get('name', instance.name)
        instance.save()
        admin_list = validated_data.get('admins')
        print (admin_list)



        return instance

моя модель:

class Company(models.Model):
    admins          = models.ManyToManyField(User, related_name='admins')
    logo            = models.ImageField(blank=True)
    name            = models.CharField(max_length=200)

Я не понимаю, почему у меня только {'name': "Mon entreprise"} как я добавил admins поле в моем JSON для PUT запроса

1 Ответ

0 голосов
/ 23 апреля 2019

У меня была та же проблема.Кажется, что PrimaryKeyRelatedField не работает должным образом с many=True для записи.В моей команде мы придумали следующее временное решение, пока у нас не будет времени разобраться, почему это не работает должным образом:

class PrimaryKeyRelatedListField(serializers.ListField):
    def __init__(self, queryset=None, **kwargs):
        assert queryset is not None, 'queryset must be specified for PrimaryKeyRelatedListField'
        self.child = serializers.PrimaryKeyRelatedField(queryset=queryset)
        super().__init__(**kwargs)

    def get_value(self, dictionary):
        dictionary = dictionary.copy()

        keys = []
        for k, _ in dictionary.items():
            if k.startswith(f'{self.field_name}['):
                keys.append(k)
        for k in keys:
            dictionary.appendlist(self.field_name, dictionary.getlist(k)[0])

        return super().get_value(dictionary)

    def to_representation(self, data):
        return super().to_representation(data.all())

Надеюсь, это поможет вам.

Хорошо,поэтому я перечитал ваш вопрос, и вы установили read_only=True в свое поле admins, это заставит DRF игнорировать любые отправляемые вами данные ... поэтому эти данные не достигнут метода update() вашего сериализатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...