Django REST Framework: Использование заголовка Accept-Language для установки "локали" экземпляра - PullRequest
0 голосов
/ 19 февраля 2020

Итак, у меня есть модель со следующим атрибутом:

locale = models.CharField(max_length=10, choices=get_locale_choices(), default='en-gb')

Связанный сериализатор для этой модели в настоящее время:

class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = '__all__'

Затем я вызываю конечную точку создания:

serializer = self.get_serializer(data=request.data)

serializer.is_valid(raise_exception=True)

self.perform_create(serializer)

Мне было интересно, как лучше всего изменить вышеупомянутое, чтобы позволить обновлять атрибут локали MyModel с помощью заголовка Accept-Language en-GB,en;q=0.5.

Я получаю выбор локали из django .conf.locale.LANG_INFO:

from django.conf.locale import LANG_INFO

def get_locale_choices():
    return [(k, v['name']) for k, v in LANG_INFO.items() if 'name' in v]

Полагаю, мне нужно передать заголовки request.hears как дополнительный контекст ...? Но я думаю, что если Accept-Language не установлен, et c? Я знаю, что это здесь:

request.headers['Accept-Language'] 

Итак, я думаю, что request.headers.get('Accept-Language', 'en-gb') было бы приемлемо ...

Но тогда, что было бы лучшим способом затем установить атрибут в serialzier как это?

NB Я также считаю, что get_serializer_context() может вернуть объект запроса?

Я также чувствую, что это может быть достаточно надежным:

data = request.POST.copy()

serializer = self.get_serializer(data=data.update({'locale': request.headers.get('Accept-Language', 'en')}))

Но так ли это «Хорошая практика»?

Мнения горячо приветствуются!

1 Ответ

1 голос
/ 19 февраля 2020

Без "с учетом locale" попробуйте этот метод, чтобы сохранить любые данные из запроса.

  1. Сначала необходимо установить locale поле до read_only
class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = '__all__'
        <b>read_only_fields = ('locale',)</b>
переопределяет метод perform_create(...) класса ModelViewset или аналогичного класса представления
class MyModelViewSet(viewsets.ModelViewSet):
    # other code
    <b>def perform_create(self, serializer):
        serializer.save(locale=self.request.headers.get('Accept-Language', 'en-gb'))</b>
...