как получить поле из модели в представлении django api - PullRequest
1 голос
/ 01 августа 2020

У меня есть представления api, которые используют модель. Я пробовал использовать headlines.objects.all (), чтобы получить все в модели, а второе представление должно получать только поле заголовка из модели, я пробовал фильтровать и получил ошибку позиционного аргумента. это мой файл просмотров.

from rest_framework import status
from rest_framework.response import Response
from rest_framework.decorators import api_view
from news.models import Headline
from news.api.serializers import *

@api_view(['GET',])
def api_detail(request, any):
    try:
        qs = Headline.objects.get(slug=any)
    except Headline.DoesNotExist:
        return Response(status = status.HTTP_404_NOT_FOUND)
    if request.method == "GET":
        serializer = HeadlineSerializer(qs)
        return Response(serializer.data)

@api_view(['GET',])
def api_head(request):
    try:
        py = Headline.objects.all().filter(title=title).order_by('-id')
    except Headline.DoesNotExist:
        return Response(status = status.HTTP_404_NOT_FOUND)
    if request.method == "GET":
        serializer = HeadlineSerializer(py, many=True)
        return Response(serializer.data)

Это мой файл serializers.py

from rest_framework import serializers
from news.models import Headline

class HeadlineSerializer(serializers.ModelSerializer):
    class Meta:
        model = Headline
        fields = ['title', 'contentt']

вот мой urls.py

from django.urls import path
from news.api.views import *

app_name = 'news'

urlpatterns = [
    path('<slug:any>/', api_detail, name='details'),
    path('', api_head, name='api_head'),


]

1 Ответ

0 голосов
/ 01 августа 2020

Проблема в этой строке:

py = Headline.objects.all().filter(title=title).order_by('-id')

title не является переменной, определенной здесь.

Если я правильно вас понял, вы хотите получить только заголовок поля, поэтому вы получите ответ, например:

[
     {
         "title": "lorem"
     },
     {
         "title": "ipsum"
     },
]

Для этого вы можете создать другой сериализатор для этого представления.

class HeadlineSerializer(serializers.ModelSerializer):
    class Meta:
        model = Headline
        fields = ['title', 'contentt']  


class HeadlineTitleSerializer(serializers.ModelSerializer):
        class Meta:
            model = Headline
            #fields will filter you response for which fields you want to return in the response.
            fields = ['title']

В вашем представлении:

@api_view(['GET',])
def api_detail(request, any):
    try:
        qs = Headline.objects.get(slug=any)
    except Headline.DoesNotExist:
        return Response(status = status.HTTP_404_NOT_FOUND)
    if request.method == "GET":
        serializer = HeadlineSerializer(qs)
        return Response(serializer.data)

@api_view(['GET',])
def api_head(request):
    py = Headline.objects.all().order_by('-id')
    if request.method == "GET":
        serializer = HeadlineTitleSerializer(py, many=True)
        return Response(serializer.data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...