python - Django REST框架: Using the Accept-Language header to set an instance's "locale"

标签 python django django-rest-framework request django-3.0

所以,我有一个具有以下属性的模型:

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)

我想知道如何最好地修改上述内容,以允许通过 Accept-Language header en-GB,en;q=0.5 更新 MyModel 的区域设置属性。

我从 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.headers 作为某种额外的上下文......?但我在想,如果未设置 Accept-Language 等怎么办?我知道它在这里:

request.headers['Accept-Language'] 

所以,我想 request.headers.get('Accept-Language', 'en-gb') 是可以接受的......

但是,在序列化器中设置属性的最佳方法是什么?

注意我也相信 get_serializer_context() 可以返回请求对象?

我也觉得这足够强大:

data = request.POST.copy()

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

但这就是“好的做法”吗?

欢迎提出宝贵意见!

最佳答案

如果没有“充分考虑区域设置,请尝试使用此方法来保存请求中的任何数据。

  1. 首先,您需要将区域设置字段设置为read_only
class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = '__all__'
        <b>read_only_fields = ('locale',)</b>
  • 重写 ModelViewset 或类似 View 类的 perform_create(...) 方法
  • class MyModelViewSet(viewsets.ModelViewSet):
        # other code
        <b>def perform_create(self, serializer):
            serializer.save(locale=self.request.headers.get('Accept-Language', 'en-gb'))</b>

    关于python - Django REST框架: Using the Accept-Language header to set an instance's "locale",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60305515/

    相关文章:

    javascript - Django 休息 : AJAX Post is not working, 400 响应

    python - 添加多个条目并从中动态检索数据

    django - 如何手动发送 django 异常日志?

    python - serializer.is_valid() 虽然 `required=False` 失败 - Django REST Framework

    django - 反向 Django 外键查找的复杂性

    python - 子应用程序中 'self' 的外键在 Django 项目中的 makemigrations 上抛出错误

    django - 使用 Django Rest Framework 按降序忽略空值

    python - 提取numpy数组类型的pandas数组的元素

    python - 如何在Python中将两个奇数列表添加到一个列表中?

    python - json.dumps() 适用于 python 2.7 但不适用于 python 3