为什么 django Rest Framework 中的嵌套灭菌器不起作用?

问题描述 投票:0回答:1

下午好,我正在制作一个 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__'

浏览次数 从rest_framework.decorators导入api_view 从rest_framework导入视图集 从rest_framework.response导入响应 从rest_framework.permissions导入* 从rest_framework.authentication导入TokenAuthentication 从 api.permissions 导入 IsAdminOrReadOnly 从 .serializers 导入 * 从 django_filters.rest_framework 导入 DjangoFilterBackend 从rest_framework.filters导入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

结果

python django django-rest-framework
1个回答
0
投票

你混淆了很多事情。让我们从您的模型开始。

在模型

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
© www.soinside.com 2019 - 2024. All rights reserved.