Почему не работает вложенный стерилизатор в django rest framework?

Добрый день, делаю API и столкнулся с проблемой, не работает встроенный стерилизатор. Модели

from django.db import models

def upload_to(instance, filename):
return 'posts/{filename}'.format(filename=filename)

class Brands (models.Model):
    BrandsDescription=models.TextField(null=True)

def __str__(self):
    return self.BrandsDescription[0:50]

class Cosmetic (models.Model):
    CosmeticName = models.TextField(default="")
    CosmeticDescription = models.TextField(null=True)
    Price = models.IntegerField(null=True)
    UrlsImage = models.ImageField(upload_to=upload_to, default = "")
    IsItNew = models.BooleanField(default="")
    Brands = models.ForeignKey(Brands,related_name="brands", on_delete=models.CASCADE)

    def __str__(self):
       return self.CosmeticName[0:50]

class Order (models.Model):
    UserToken = models.TextField(default="")
    Date= models.DateTimeField(auto_now_add=True)
    Product = models.ManyToManyField(Cosmetic)
    Price = models.IntegerField(null=True)

class Meta:
    ordering = ['UserToken']

def __str__(self):
    return self.UserToken[0:50]

Сериализаторы

from dataclasses import field
from rest_framework.serializers import ModelSerializer
from rest_framework import serializers
from .models import *


class BrandsSerializer(ModelSerializer):
    class Meta:
        model= Brands
        fields='__all__'

class CosmeticSerializer(ModelSerializer):
    brands=BrandsSerializer(read_only=True, many=True)
    class Meta:
        model= Cosmetic
        fields=('CosmeticName','CosmeticDescription','Price','UrlsImage','IsItNew','brands')

class OrderSerializer(ModelSerializer):
    product = CosmeticSerializer(read_only=True, many=True)
    class Meta:
        model= Order
        fields=('UserToken','Date','product','Price')

class postOrderSerializer(ModelSerializer):
    class Meta:
        model= Order
        fields='__all__'

Виды from rest_framework.decorators import api_view из rest_framework import viewsets из rest_framework.response import Response from rest_framework.permissions import * from rest_framework.authentication import TokenAuthentication from api.permissions import IsAdminOrReadOnly from .serializers import * из django_filters.rest_framework import DjangoFilterBackend from rest_framework.filters import SearchFilter

class BrandsAPI(viewsets.ModelViewSet):
    queryset= Brands.objects.all()
    serializer_class = BrandsSerializer

    def get_paginated_response(self, data):
       return Response(data)



class CosmeticAPI(viewsets.ModelViewSet):
    queryset= Cosmetic.objects.all()
    serializer_class = CosmeticSerializer

    def get_paginated_response(self, data):
       return Response(data)


class OrderAPI(viewsets.ModelViewSet):
    queryset= Order.objects.all()
    serializer_class = OrderSerializer
    filter_backends = (DjangoFilterBackend, SearchFilter)
    search_fields = ['UserToken']

    def get_paginated_response(self, data):
       return Response(data)

class PostOrderAPI(viewsets.ModelViewSet):
    queryset= Order.objects.all()
    serializer_class= postOrderSerializer

result

enter image description here

Вы многое перепутали. Давайте начнем с ваших моделей.

Внутри ваших моделей Cosmetics у вас есть поле с именем Brands, которое является ForeignKey для моделей Brands, вы устанавливаете связанное имя brands. Это означает, что из экземпляра Brands можно получить доступ ко всем Cosmetic, которые связаны с этим экземпляром Brands. Таким образом, не запутанное связанное_имя может cosmetics.

Теперь перейдем к сериализаторам.

В CosmeticSerialiers вы создали поле с именем brand, которое является встроенным сериализатором для BrandsSerializer, но это совершенно неправильно. У каждой косметики есть только один бренд, связанный с ней.

Если вы хотите сделать то, что хотите, то это находится в BrandsSerializer, где вы можете добавить поля

brands = CosmeticSerializer(read_only=True, many=True)

Для OrderSerializer проблема в том, что в имени поля допущена опечатка.

В модели Order поле ManyToMany - это Product, а в OrderSerializer поле, на которое вы установили встраивание сериализатора CosmeticSerializer, - это product. Заглавная буква все меняет, это означает, что это совершенно новое поле, которое вы создали в OrderSerializer.

Я рекомендую вам следовать PEP для вашего соглашения об именовании.

  • Имя переменных, функций и полей: snake_case
  • Имена классов: PascalCase
Вернуться на верх