[英]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.其他文件如下所示。
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')
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.