Невозможно отобразить поле 'name' в REST API

Когда я пытаюсь получить все данные из моего REST API, я получаю их правильно, за исключением одного поля, это поле 'name' из класса Skill. Вместо 'name' я получаю только его id. Не могли бы вы помочь мне решить эту проблему? ----------------------------------------------

вот вывод Вот код:

models.py

from django.db import models
from django.forms import ImageField
from django.utils.text import slugify



class Skill(models.Model):
    name = models.CharField(max_length=200)

    def __str__(self):
        return self.name

    

class Project(models.Model):
    title = models.CharField(max_length=200)
    sub_title = models.CharField(max_length=200, null=True, blank=True)
    front_page = models.ImageField(null=True, blank=True, upload_to="images", default="broken-image.png")
    body = models.TextField(null=True, blank=True)
    created = models.DateTimeField(auto_now_add=True)
    skills = models.ManyToManyField(Skill, null=True)
    slug = models.SlugField(null=True, blank=True)

    def __str__(self):
        return self.title
    
    def save(self, *args, **kwargs):
    
        if self.slug == None:
            slug = slugify(self.title)

            has_slug = Project.objects.filter(slug=slug).exists()
            count = 1
            while has_slug:
                count += 1
                slug = slugify(self.title) + '-' + str(count) 
                has_slug = Project.objects.filter(slug=slug).exists()

            self.slug = slug

        super().save(*args, **kwargs)

serializers.py

from rest_framework import serializers
from project.models import Project, Skill


class ProjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = Project
        fields = '__all__'

views.py

from rest_framework.response import Response
from rest_framework.decorators import api_view
from project.models import Project, Skill
from .serializers import ProjectSerializer
from rest_framework import status
from django.shortcuts import get_object_or_404


@api_view(['GET'])
def getData(request):
    project = Project.objects.all()
    serializer = ProjectSerializer(project, many=True)
    return Response(serializer.data)


@api_view(['POST'])
def create(request):
    serializer= ProjectSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
    return Response(serializer.data)


@api_view(['POST'])
def update(request, pk):
    item = Project.objects.get(pk=pk)
    serializer = ProjectSerializer(instance=item, data=request.data)
  
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data)
    else:
        return Response(status=status.HTTP_404_NOT_FOUND)



@api_view(['DELETE'])
def delete(request, pk):
    item = get_object_or_404(Project, pk=pk)
    item.delete()
    return Response(status=status.HTTP_202_ACCEPTED)

urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.getData),
    path('create/', views.create),
    path('update/<int:pk>/', views.update),
    path('<int:pk>/delete/', views.delete),
]

Вам необходимо предоставить SkillSerializer и ссылаться на него в ваших ProjectSerializer. Кроме того, лучше явно указать поля, которые вы хотите видеть в своих сериализаторах, так как __all__ может раскрыть поля, которые вы не хотите раскрывать, или вызвать нежелательные запросы к базе данных.

https://www.django-rest-framework.org/api-guide/relations/#nested-relationships

Используйте SlugRelatedField [drf-doc], чтобы указать, что вы хотите использовать name навыков, так:

from rest_framework import serializers
from project.models import Project, Skill


class ProjectSerializer(serializers.ModelSerializer):
    skills = serializers.SlugRelatedField(
        many=True, slug_field='name', queryset=Skill.objects.all()
    )

    class Meta:
        model = Project
        fields = '__all__'

Приятной особенностью таких SlugRelatedField является то, что это может работать двунаправлено: вы можете не только сериализовать данные, но и использовать их для указания навыков и таким образом создавать или обновлять Projects.

Вернуться на верх