在Django Rest Framework JSON API中使用slug而不是ID

时间:2019-02-18 17:02:16

标签: django django-rest-framework

我的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"
       }
    },
]

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)),
]