django-parler-rest icon indicating copy to clipboard operation
django-parler-rest copied to clipboard

using TranslatedFieldsField for translations field in update , partial update model view set

Open farouk-46015 opened this issue 1 year ago • 0 comments

I have model translation include fox ex : title , slug fields

the problem on update you get error when serializing data that field slug all ready exist

the cause of the problem in TranslatedFieldsField class in to_internal_value fun

serializer = self.serializer_class(data=model_fields)

so in update we have to pass instance to the serializer

I worked on it

` def to_internal_value(self, data): """ Deserialize data from translations fields.

    For each received language, delegate validation logic to
    the translation model serializer.
    """
    if data is None:
        return

    if not isinstance(data, dict):
        self.fail('invalid')
    if not self.allow_empty and len(data) == 0:
        self.fail('empty')
    if self.shared_model is None:
        return

    # related_name = self.source or field_name
    result, errors, = {}, {}
    translated_model = self.shared_model.__dict__[self.source].field.model
    for lang_code, model_fields in data.items():
        if 'id' in model_fields:
            instance = translated_model.objects.get(pk=model_fields['id'])
            serializer = self.serializer_class(instance, data=model_fields, partial=self.parent.partial)
        else:
            serializer = self.serializer_class(data=model_fields)
        if serializer.is_valid():
            result[lang_code] = serializer.validated_data
        else:
            errors[lang_code] = serializer.errors

    if errors:
        raise serializers.ValidationError(errors)
    return result`

so could you edit your code so it would work on update and partial update

farouk-46015 avatar Mar 16 '23 10:03 farouk-46015