Как добавить валидацию в api фреймворка django rest

У меня есть две модели, которые выглядят следующим образом:

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, поэтому любая помощь будет очень признательна!

для справки, мой класс views выглядит так

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
Вернуться на верх