你如何向 django rest 框架添加验证 api

How do you add validation to django rest framework api

我有两个模型,看起来像这样:

class Item(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=60)
    sku = models.CharField(max_length=60)
    description = models.TextField()
    price = models.DecimalField(max_digits=6, decimal_places=2)
    location = models.CharField(max_length=60)
    serial_number = models.CharField(max_length=60)

    def __str__(self):
        return self.name

class Warehouse(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=60)

    def __str__(self):
        return self.name

他们有两个序列化程序,如下所示:

class ItemSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Item
        fields = ('id', 'name', 'sku', 'description', 'price', 'location', 'serial_number')
        #we need a validator that checks if location is in the list of warehouses
        #we need a validator that checks if sku is in the list of products
    

class WarehouseSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Warehouse
        fields = ('id', 'name')
        

我需要一种方法来确保新创建项目的位置字段与仓库中的现有名称字段相匹配。我还需要删除仓库以触发删除该仓库中的所有项目,或者失败;如果仓库有物品,则无法删除。

我是 python 和 django 的新手,非常感谢任何帮助!

供参考,我的观点class看起来像

class ItemViewSet(viewsets.ModelViewSet):
    queryset = Item.objects.all().order_by('name')
    serializer_class = ItemSerializer

class WarehouseViewSet(viewsets.ModelViewSet):
    queryset = Warehouse.objects.all().order_by('name')
    serializer_class = WarehouseSerializer

如果这有帮助,但据我所知,我不希望它有帮助。 提前致谢!

我认为这里的问题是您的数据模型。很明显,仓库和物品之间存在一对多关系。这样,您的模型中就会有类似的东西。

from django.db import models


class Warehouse(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=60)

    def __str__(self):
        return self.name


class Item(models.Model):
    id = models.AutoField(primary_key=True)
    warehouse = models.ForeignKey(Warehouse, related_name="items", on_delete=models.CASCADE)
    name = models.CharField(max_length=60)
    sku = models.CharField(max_length=60)
    description = models.TextField()
    price = models.DecimalField(max_digits=6, decimal_places=2)
    location = models.CharField(max_length=60)
    serial_number = models.CharField(max_length=60)

    def __str__(self):
        return self.name

on_delete=models.CASCADE将确保在删除仓库时删除与仓库相关的所有项目。外键关系将确保您在创建项目时提供的仓库 id 在创建项目之前存在。

其他文件如下所示。

serializers.py

from rest_framework import serializers

from .models import Warehouse, Item


class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = ('id', 'name', 'sku', 'description', 'price', 'location', 'serial_number', "warehouse")


class WarehouseSerializer(serializers.HyperlinkedModelSerializer):
    items = serializers.StringRelatedField(many=True, required=False)

    class Meta:
        model = Warehouse
        fields = ('id', 'name', 'items')

views.py

from .models import Item, Warehouse
from .serializers import ItemSerializer, WarehouseSerializer

from rest_framework import viewsets


class ItemViewSet(viewsets.ModelViewSet):
    queryset = Item.objects.all().order_by('name')
    serializer_class = ItemSerializer


class WarehouseViewSet(viewsets.ModelViewSet):
    queryset = Warehouse.objects.all().order_by('name')
    serializer_class = WarehouseSerializer