我的ember应用程序期望JSON响应包含模型ID的主键结果。我不想使用整数ID,而是要使用子弹。我知道在标准django框架中您可以执行以下操作:
from rest_framework import serializers
from .models import Page
class PageSerializer(serializers.ModelSerializer):
id = serializers.CharField(source='slug')
class Meta:
model = Page
fields = ('name','id',...etc )
但是,这在使用json api时不起作用-在我的响应中,我仍然有类似
"data": [{
"type": "pages",
"id": "2",
"attributes": {
"name": "Some page name",
}]
当我希望“ id”字段类似于“ some-page-name”(子弹)
使用json api无法做到这一点吗?为了清楚起见,上面的等效json api导入将是
from rest_framework_json_api import serializers
非常感谢
****另外****
为帮助阐明我面临的问题,以下是使用标准REST框架的序列化程序。 Page模型中包含下面显示的所有属性。
from rest_framework import serializers
from .models import Page
class PageSerializer(serializers.ModelSerializer):
id = serializers.CharField(source='slug')
class Meta:
model = Page
fields = ('name','id')
我在http://localhost:8000/api/pages处获得的JSON响应如下
[
{
"name": "Page 1",
"id": "page-1"
},
{
"name": "Page 2",
"id": "page-2"
},
{
etc
}
]
当我使用json api时,做的完全一样,但是显然是导入
from rest_framework_json_api import serializers
我无法以相同的方式更改id值,查看http://localhost:8000/api/pages
时出现类似的情况{
"links": {
omitted for brevity ...
},
"data": [
{
"type": "pages",
"id": "1",
"attributes": {
"name": "Page 1"
}
},
{
"type": "pages",
"id": "2",
"attributes": {
"name": "Page 2"
}
},
]
答案 0 :(得分:0)
我认为您想要的是使用slug字段而不是id作为主键,以便您可以在url中传递该参数以获得所需的结果。 您可以在网址中执行类似的操作
url(r'^something-here/(?P<slug>[\w-]+)/$', "your_view_name_here", name='name_you_want')
在您看来,您可以执行以下操作:
class YourListAPIView(ListAPIView):
serializer_class = YourSerializer
def get_queryset(self):
slug = self.kwargs['slug']
return ModelName.objects.filter(slug=slug)
答案 1 :(得分:0)
这是一种解决方案,它使我可以在http://localhost:8000/api/pages处查看响应并以Emberjs(期望响应符合JSON API规范)不会的格式向http://localhost:8000/api/pages/some-slug发出请求抱怨。
在我的序列化程序(PageSerializer.py)中:
from rest_framework_json_api import serializers
from .models import Page
class PageSerializer(serializers.ModelSerializer):
class Meta:
model = Page
fields = ('name','id','url','slug')
lookup_field = 'slug'
// if you want to show the links field in the response
extra_kwargs = {'url': {'lookup_field':'slug'}}
在视图(PageViewSet)中
from rest_framework import viewsets
from .models import Page
from .serializers import PageSerializer
class PageViewSet(viewsets.ModelViewSet):
queryset = Page.objects.all().order_by('name')
serializer_class = PageSerializer
lookup_field = 'slug'
路由器保持不变:
from django.urls import path, include
from rest_framework import routers
from page import views
router = routers.DefaultRouter(trailing_slash=False)
router.register('pages',views.PageViewSet)
urlpatterns = [
path('api/',include(router.urls)),
]