Почему не работает вложенный стерилизатор в 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
Вы многое перепутали. Давайте начнем с ваших моделей.
Внутри ваших моделей 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