Django - ApiDetailView - PullRequest
       2

Django - ApiDetailView

2 голосов
/ 12 февраля 2020

Я следую этому решению о том, как получить указанные c поля из django модели:

Выбрать определенные c поля в Django get_object_or_404

from django.core import serializers as djangoserializer  # module 'rest_framework.serializers' has no attribute 'serialize'

class ProjectDetailApiView(APIView):
    authentication_classes = (authentication.SessionAuthentication,)
    permission_classes = (permissions.IsAuthenticated,)
    def get(self, request, slug=None, format=None):
        project_instance = get_object_or_404(Project.objects.only('project_title', 'project_post'), slug=slug)
        data = djangoserializer.serialize('json', [ project_instance, ], fields=('project_title','project_post'))
        user = self.request.user
        updated = False
        viewed = False
        if not user in project_instance.project_views.all():
            viewed = True
            project_instance.project_views.add(user)
        updated = True
        data = {
            "project": data,
            "updated":updated,
            "viewed":viewed 
        }
        return Response(data)

Вывод:

{
    "project": "[{\"model\": \"webdata.project\", \"pk\": 4, \"fields\": {\"project_title\": \"Project 4\", \"project_post\": \"Blabla\"}}]",
    "updated": true,
    "viewed": false
}

Желаемый вывод:

{
    "project_title": "Project 4",
    "project_post": "Blabla",
    "updated": true,
    "viewed": false
}

Спасибо

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Используйте Сериализатор DRF вместо встроенного сериализатора Django.

# serializers.py
<b>from rest_framework import serializers


class ProjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = Project
        fields = ('project_title', 'project_post', 'updated', 'viewed')</b>


# views.py
class ProjectDetailApiView(APIView):
    authentication_classes = (authentication.SessionAuthentication,)
    permission_classes = (permissions.IsAuthenticated,)

    def get(self, request, slug=None, format=None):
        <b>project_instance = get_object_or_404(Project, slug=slug)
        serializer = ProjectSerializer(project_instance)
        return Response(serializer.data)</b>
0 голосов
/ 12 февраля 2020

Сериализация обычных словарей очень хороша в python.

Так что вместо настройки сериализатора - почему бы просто не создать словарь python с нужными данными? (Вот как я делаю это для простых вещей, которые мне нужны только в одном месте.)

    data = {
        "project_title": project_instance.project_title,
        "project_post": project_instance.project_post,
        "updated":updated,
        "viewed":viewed 
    }
    return JSONResponse(data)

Вы не опубликовали модель проекта, я просто предполагаю из конфигурации сериализатора, что поля названы project_title и project_post.

. Будет возвращен ответ со статусом 200, mimetype application / json и данными, которые будут действительными JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...