- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要通过 django rest_framework
传递一组配置设置(键值对)到一个 api-enpoint。只读就好了。 Django 1.7、Python3 和 Rest-framework v3.0.5。
我有pip install
编django-solo
,我可以在管理部分访问它,所以我认为它有效。我已经设置了一条有效的路线,现在我需要制作实际返回数据的“类似 View 的东西”。
据我所知(绝对是错误的):
class ConfigViewSet(mixins.ListModelMixin,
mixins.RetrieveModelMixin,
viewsets.GenericViewSet):
model = SiteConfiguration
permission_classes = (IsAuthenticatedOrReadOnly,)
def get_serializer_class(self):
# What goes here? I want _all_ the settings
def get_object(self):
obj = self.model.get_solo()
self.check_object_permissions(self.request, obj)
return obj
def list(self, *args, **kwargs):
return self.retrieve(*args, **kwargs)
感谢任何帮助和提示。
PS!这是config/models.py
具有以下设置:
from django.db import models
from solo.models import SingletonModel
class SiteConfiguration(SingletonModel):
site_name = models.CharField(max_length=255, default='Site Name')
maintenance_mode = models.BooleanField(default=False)
def __str__(self):
return u"Site Configuration"
class Meta:
verbose_name = "Site Configuration"
最佳答案
好吧,这里是:
1) pip-install 'django-solo'。
2) 使用 manage.py startapp config
创建一个新应用。
2a) 文件config/models.py
:
from django.db import models
from solo.models import SingletonModel
class SiteConfiguration(SingletonModel):
site_name = models.CharField(max_length=255, default='Site Name')
maintenance_mode = models.BooleanField(default=False)
def __str__(self):
return u"Site Configuration"
class Meta:
verbose_name = "Site Configuration"
2b) 文件config/views.py
:
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import SiteConfiguration
config = SiteConfiguration.get_solo()
class SiteConfiguration(APIView):
permission_classes = []
def get(self, request, format=None):
"""
Return site configuration key-values.
"""
return Response({
'name': config.site_name
})
3) 下一个问题是将 View 添加到路由器。使用 DefaultRouter
时,无法注册 APIview
,因此这个人有一个简单的 HybridRouter
解决方案 [ https://stackoverflow.com/a/23321478/1008905] .
3a) 在项目文件夹(主要 urls.py
文件所在的位置)中创建一个 custom_routers.py
,内容如下:
from rest_framework import routers, views, reverse, response
class HybridRouter(routers.DefaultRouter):
def __init__(self, *args, **kwargs):
super(HybridRouter, self).__init__(*args, **kwargs)
self._api_view_urls = {}
def add_api_view(self, name, url):
self._api_view_urls[name] = url
def remove_api_view(self, name):
del self._api_view_urls[name]
@property
def api_view_urls(self):
ret = {}
ret.update(self._api_view_urls)
return ret
def get_urls(self):
urls = super(HybridRouter, self).get_urls()
for api_view_key in self._api_view_urls.keys():
urls.append(self._api_view_urls[api_view_key])
return urls
def get_api_root_view(self):
# Copy the following block from Default Router
api_root_dict = {}
list_name = self.routes[0].name
for prefix, viewset, basename in self.registry:
api_root_dict[prefix] = list_name.format(basename=basename)
api_view_urls = self._api_view_urls
class APIRoot(views.APIView):
_ignore_model_permissions = True
def get(self, request, format=None):
ret = {}
for key, url_name in api_root_dict.items():
ret[key] = reverse.reverse(url_name, request=request, format=format)
# In addition to what had been added, now add the APIView urls
for api_view_key in api_view_urls.keys():
ret[api_view_key] = reverse.reverse(api_view_urls[api_view_key].name, request=request, format=format)
return response.Response(ret)
return APIRoot.as_view()
3b) 在你的主 urls.py
中执行以下操作:
from .custom_routers import HybridRouter
# The rest is from the `rest-framework` polls-tutorial.
rest_router = HybridRouter()
rest_router.register(r'users', UserViewSet)
rest_router.register(r'polls', PollViewSet)
rest_router.add_api_view("config", url(r'^config/$', configViews.SiteConfiguration.as_view(), name='site_configuration'))
# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
url(r'^', include(rest_router.urls), name='rest_api'),
url(r'^auth/', include('rest_framework.urls', namespace='rest_framework')),
url(r'^admin/', include(admin.site.urls), name='admin'),
]
所有这些似乎都对我有用。
关于python - djangorest-framework单例ViewSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28631688/
我需要通过 django rest_framework 传递一组配置设置(键值对)到一个 api-enpoint。只读就好了。 Django 1.7、Python3 和 Rest-framework
我有一个 Django 后端,它使用 REST API(使用 DjangoREST 框架制作)与基于 React.js 的前端进行通信。 到目前为止,我在 gcloud 上部署的所有类似项目都使用两个
我是 REST 新手,并尝试创建简单的应用程序,其中包含一个模型和两个字段 CharField、ImageField。型号: class Photo(models.Model): img =
我正在尝试使用 boto3 签署一个网址,如下所示: @list_route(methods=['get']) def sign(self, request): key =
我是一名优秀的程序员,十分优秀!