Python 如何通过Django Rest框架公开Django Constance设置?

Python 如何通过Django Rest框架公开Django Constance设置?,python,django,rest,django-rest-framework,Python,Django,Rest,Django Rest Framework,我正在构建一个项目,其中我需要一些自定义设置,这些设置可由某些用户编辑,这些用户无权访问django管理面板,他们可以通过角度前端访问应用程序 我安装django constance是为了让这些自定义设置可以编辑,因为它是我在网站上找到的最推荐的软件包。我现在的问题是,我不知道如何为API rest上的设置提供服务 我从一些定制视图开始: class ConstanceSettingSerializer(serializers.Serializer): name = serializers.C

我正在构建一个项目,其中我需要一些自定义设置,这些设置可由某些用户编辑,这些用户无权访问django管理面板,他们可以通过角度前端访问应用程序

我安装django constance是为了让这些自定义设置可以编辑,因为它是我在网站上找到的最推荐的软件包。我现在的问题是,我不知道如何为API rest上的设置提供服务

我从一些定制视图开始:

class ConstanceSettingSerializer(serializers.Serializer):

name = serializers.CharField()
value = serializers.Field()
defult_value = serializers.Field()
modified = serializers.BooleanField(read_only=True)


from constance import settings as constance_settings

class ConstanceView(APIView):

def get(self, request):

    settings = constance_settings.CONFIG.items()

    return Response(settings, status=status.HTTP_200_OK)
但是现在我不知道如何将这些设置正确地传递给我的序列化程序。我试过了,但没有成功:

 settings_serializer = ConstanceSettingSerializer(settings)
 return Response(settings_serializer.data, status=status.HTTP_200_OK)
我只会犯错误

你知道怎么做吗


谢谢

序列化程序需要知道返回什么。因此,对于每个字段,您可以执行如下操作:

class ConstanceSettingSerializer(serializers.Serializer):

    setting_name = serializers.SerializerMethodField()

    def get_setting_name(self):
        settings = constance_settings.CONFIG.items()
        # Retrieve your setting's value here and return
        return setting_value
这就要结束了。如果希望能够通过PUT/POST/PATCH更改设置,则需要覆盖序列化程序中的create/update,并实现自己保存值的逻辑

另一种方法是检查设置的存储是如何实现的。 我没有使用constance设置,所以我不能说。但如果它使用DB存储设置,则可以为它们使用的模型实现模型序列化器

给你演示一下

from .utils import get_settings
from constance import config
from rest_framework.viewsets import ViewSet

class SettingViewSet(ViewSet):
    permission_classes = (IsAuthenticated,)

    def setting(self, request, allow_settings):
        if request.method == 'GET':
            # list all setting items
            return Response(data=get_settings(allow_settings))
        else:
            # change all allow setting items in allow_settings
            for key in request.data:
                if key in allow_settings and key in getattr(settings, 'CONSTANCE_CONFIG', {}):
                    value = request.data[key]
                    setattr(config, key, '' if value is None else value)
            return Response(data=get_settings(allow_settings))

    def create(self, request):
        """
        <p>update with POST:<code>{'Key': new_value}</code>
        """
        allow_settings = [key for key, options in getattr(settings, 'CONSTANCE_CONFIG', {}).items()]
        return self.setting(request, allow_settings)

    def list(self, request):
        """
        get all setting item
        """
        allow_settings = [key for key, options in getattr(settings, 'CONSTANCE_CONFIG', {}).items()]
        return self.setting(request, allow_settings)
在utils.py中:

def get_settings(allow_settings):
    setting_list = []
    for key, options in getattr(settings, 'CONSTANCE_CONFIG', {}).items():
        if key in allow_settings:
            default, help_text = options[0], options[1]
            data = {'key': key,
                    'default': default,
                    'help_text': help_text,
                    'value': getattr(config, key)}
            setting_list.append(data)
    return setting_list
在URL.py中:

router.register(r'setting', SettingViewSet, base_name='setting')
询问获取
http://x.x.x.x/setting/
您可以获得:

[
    {
        "key": "staff_prefix",
        "default": "",
        "help_text": "工号固定代码",
        "value": ""
    },
    {
        "key": "staff_suffix",
        "default": 3,
        "help_text": "工号尾缀",
        "value": "3"
    }
]

post
http://x.x.x.x/setting/
使用数据
{'staff_prefix':'demo'}
您可以更新
staff_prefix
中的值!它对于列出设置非常有效,但是对于更新设置却没有效果,当我尝试更新一些设置时,我得到了“方法帖子是不允许的”。我不需要“用户名”部分,因为我的设置是全局更新的,但未经测试。你可以自己测试,或者等我明天测试。我不太明白你想用这个允许设置做什么,我想这是硬编码哪些设置可以更改,哪些不应该更改的一种方法。在我的情况下,只应更改constance设置。我将把它标记为正确的,因为它为我找到了解决方法。谢谢!:)我调整代码以满足您的需要,请再次查看答案