简体   繁体   English

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

[英]How do you add validation to django rest framework api

I have two models, which look like this:我有两个模型,看起来像这样:

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

and they have two serializers which look like this:他们有两个如下所示的序列化程序:

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')
        

I need a way to ensure that the location field for newly created items matches an existing name field from a warehouse.我需要一种方法来确保新创建的项目的位置字段与仓库中现有的名称字段匹配。 I also need the deletion of a warehouse to trigger the deletion of all items in that warehouse, or, failing that;我还需要删除一个仓库来触发该仓库中所有项目的删除,或者,如果失败了; if the warehouse has items, it cannot be deleted.如果仓库有物品,则不能删除。

I'm brand new to python and django, so any help would be massively appreciated!我是 python 和 django 的新手,因此我们将不胜感激任何帮助!

for reference, my views class looks like作为参考,我的观点 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

if that helps, but from what I can see I don't expect it to.如果这有帮助,但据我所知,我不希望它。 Thanks in advance!提前致谢!

I think the problem here is your data models.我认为这里的问题是您的数据模型。 It's clear that a warehouse and an item have a one to many relationship.很明显,仓库和物品具有一对多的关系。 With that, you would have something like this in your models.这样,您的模型中就会有类似的东西。

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

The on_delete=models.CASCADE will ensure that all items related to a warehouse are deleted when a warehouse is deleted. on_delete=models.CASCADE将确保在删除仓库时删除与仓库相关的所有项目。 The foreign key relationship will ensure that warehouse id you provide when creating the item, exists before the item is created.外键关系将确保您在创建项目时提供的仓库id在创建项目之前存在。

The other files will look as follows.其他文件如下所示。

serializers.py序列化程序.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视图.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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM