Сериализатор Python django -> validated_data удаляет поле

Цель: добавить объект в поле ManyToMany другой модели данных.

Модель данных с полем ManyToMany:

class ObservedDataModel(models.Model):
    domain_objects = models.ManyToManyField(DomainNameModel, blank=True)

Следующий код работает, но идентификатор постороннего объекта жестко запрограммирован ((ObservedDataModel, id=2)):

class DomainSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = DomainNameModel
        fields = ('url', 'id', 'name')

    def create(self, validated_data):
        domain_obj = DomainNameModel.objects.create(name=validated_data['name'])

        observed_data_object = get_object_or_404(ObservedDataModel, id=2)  # TODO !!!!!!
        observed_data_object.domain_objects.add(domain_obj)

        return domain_obj

Чтобы позволить пользователю установить (ObservedDataModel, id=X), я попытался отправить запрос {'name': 'apple.com', 'observeddata': 2}, но поле validated_data не содержит переменной observeddata.

Итак, как я могу добавить пользовательское (не модельное) поле в переменную validated_data?


person gies0r    schedule 10.06.2017    source источник


Ответы (2)


Только что нашел ответ, используя предложение stackoverflow для моего вопроса (отличная функция!). Решение состоит в том, чтобы перезаписать to_internal_value, как показано ниже:

def to_internal_value(self, data):
    internal_value = super(DomainSerializer, self).to_internal_value(data)
    my_non_model_field_raw_value = data.get("observeddata")
    my_non_model_field_value = my_non_model_field_raw_value
    internal_value.update({
        "observeddata": my_non_model_field_value
    })
    return internal_value

Спасибо trubliphone

person gies0r    schedule 10.06.2017

Переопределить метод инициализации сериализатора,

class DomainSerializer(serializers.HyperlinkedModelSerializer): 

    def __init__(self, obs_data, *args, **kwargs):
        super(DomainSerializer, self).__init__(*args, **kwargs)
        self.obs_data = obs_data

    class Meta: 
        model = DomainNameModel
        fields = ('url', 'id', 'name') 

    def create(self, validated_data):
        domain_obj = DomainNameModel.objects.create(name=validated_data['name'])
        observed_data_object = get_object_or_404(ObservedDataModel, id=self.obs_data) # here's the item....
        observed_data_object.domain_objects.add(domain_obj)
        return domain_obj

Во взглядах,

DomainSerializer(data=your_data, obs_data=observed_data_id)
person zaidfazil    schedule 10.06.2017