Использование слага, а не ID в django остальные рамки JSON API - PullRequest
0 голосов
/ 18 февраля 2019

Мое приложение ember ожидает, что ответ JSON будет содержать результат первичного ключа для идентификатора модели.Вместо того, чтобы использовать целочисленные идентификаторы, я хочу использовать слагов.Я знаю, что в стандартном фреймворке 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" (slug)

Разве это невозможно с json api.Для ясности эквивалентный импорт json api выше будет

 from rest_framework_json_api import serializers

Большое спасибо

**** добавление ****

Чтобы помочь прояснить проблему, с которой я столкнулсяВот сериализатор, использующий стандартную среду REST.Все атрибуты, показанные ниже, включены в модель страницы.

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')

Ответ JSON, который я получаю на http://localhost:8000/api/pages, выглядит следующим образом

 [
    {
      "name": "Page 1",
      "id": "page-1"
   },
   {
    "name": "Page 2",
    "id": "page-2"
   },
   {
     etc
   }
 ]

Когда я использую json api, делаю то же самое, но, очевидно, импортирую

from rest_framework_json_api import serializers 

Я не могу изменить значение идентификатора таким же образом, у меня что-то подобное при просмотре 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 голосов
/ 20 февраля 2019

Это решение, которое позволяет мне просматривать ответы, например, http://localhost:8000/api/pages и отправлять запрос к http://localhost:8000/api/pages/some-slug в формате, который выиграл Emberjs (ожидая, что ответ будет соответствовать спецификации JSON API)не жалуюсь.

В моем сериализаторе (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)),
]
0 голосов
/ 18 февраля 2019

Я думаю, что вы хотите использовать ваше поле slug вместо id в качестве первичного ключа, чтобы вы могли передать этот параметр в ваш URL, чтобы получить желаемый результат.Вы можете сделать что-то подобное в своем 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)
...