Django Ошибка целостности: NOT NULL Constraint failed. Как исправить?
Я новичок в django. Я слабо разбираюсь в реляционной сериализации. Пожалуйста, помогите мне решить следующую проблему.
Проблема: Я хочу создать модель, сериализаторы и весь необходимый код. В основном я хочу решить курс SERA project assesment по курсу API. Когда я запустил свой код и протестировал, я увидел ошибку: django.db.utils.IntegrityError: NOT NULL constraint failed: LittleLemonAPI_menuitem.category_id
Это происходит, когда я определяю depth =1 в MenuItemSerializer и создаю новый пункт меню. Если я убираю depth = 1 и category = CategorySerializer, то ошибки не происходит. Но тогда данные таблицы категорий не заполняются.
Ниже я добавляю необходимый код:
serializers.py
from rest_framework import serializers, validators
from .models import Category, MenuItem, Cart, Order, OrderItem
from django.contrib.auth.models import User, Group, Permission
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = ['id', 'slug', 'title']
validators = [
validators.UniqueTogetherValidator(
queryset=Category.objects.all(),
fields=('title',),
message="Category must be unique"
)
]
class MenuItemSerializer(serializers.ModelSerializer):
class Meta:
model = MenuItem
category = CategorySerializer()
fields = ['id', 'title', 'price',
'featured', 'inventory', 'category',]
depth = 1
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id', 'username', 'email', 'groups',]
depth = 1
class CartSerializer(serializers.ModelSerializer):
class Meta:
model = Cart
user = UserSerializer()
menuitem = MenuItemSerializer()
fields = ['id', 'user', 'menuitem', 'quantity', 'unit_price', 'price']
depth = 1
validators = [
validators.UniqueTogetherValidator(
queryset=MenuItem.objects.all(),
fields=('id',),
message="Menuitem should be unique in this curt"
),
validators.UniqueTogetherValidator(
queryset=User.objects.all(), fields=('id'), message="User should be unique")
]
class OrderSerilizer(serializers.ModelSerializer):
class Meta:
model = Order
fields = ['id', 'user', 'delivery_crew', 'status', 'total', 'date']
depth = 1
class OrderItemSerializer(serializers.ModelSerializer):
class Meta:
model = OrderItem
fields = ['id', 'order', 'menuitem', 'quantity', 'unit_price', 'price']
depth = 1
validators = [
validators.UniqueTogetherValidator(
queryset=Order.objects.all(),
fields=('id',)
),
validators.UniqueTogetherValidator(
queryset=MenuItem.objects.all(),
fields=('id',)
)
]
models.py
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Category(models.Model):
slug = models.SlugField()
title = models.CharField(max_length=255, db_index=True)
class MenuItem(models.Model):
title = models.CharField(max_length=255, db_index=True)
price = models.DecimalField(max_digits=6, decimal_places=2, db_index=True)
featured = models.BooleanField(db_index=True)
category = models.ForeignKey(Category, on_delete=models.PROTECT)
inventory = models.IntegerField()
class Cart(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
menuitem = models.ForeignKey(MenuItem, on_delete=models.CASCADE)
quantity = models.SmallIntegerField(),
unit_price = models.DecimalField(max_digits=6, decimal_places=2)
price = models.DecimalField(max_digits=6, decimal_places=2)
class Meta:
unique_together = ('menuitem', 'user')
class Order(models.Model):
user = models.ForeignKey(User, models.CASCADE)
delivery_crew = models.ForeignKey(
User, on_delete=models.SET_NULL, related_name='delivery_crew', null=True)
status = models.BooleanField(db_index=True, default=0)
total = models.DecimalField(max_digits=6, decimal_places=2)
date = models.DateField(db_index=True)
class OrderItem(models.Model):
order = models.ForeignKey(User, on_delete=models.CASCADE)
menuitem = models.ForeignKey(MenuItem, on_delete=models.CASCADE)
quantity = models.SmallIntegerField()
unit_price = models.DecimalField(max_digits=6, decimal_places=2)
price = models.DecimalField(max_digits=6, decimal_places=2)
class Meta:
unique_together = ('order', 'menuitem')
Error: django.db.utils.IntegrityError: NOT NULL constraint failed: LittleLemonAPI_menuitem.category_id
Я пытаюсь добавить пункты меню, но когда я назначаю depth = 1, возникает ошибка avobe.
Ошибка: django.db.utils.IntegrityError: NOT NULL constraint failed: LittleLemonAPI_menuitem.category_id
.
Эта ошибка говорит о том, что при создании пункта меню необходимо указать идентификатор категории.
Другая ошибка связана с использованием depth в сериализаторе записи. Убрав это и категорию в Meta, вы будете в порядке.
С этим сериализатором:
class MenuItemSerializer(serializers.ModelSerializer):
class Meta:
model = MenuItem
fields = ['id', 'title', 'price',
'featured', 'inventory', 'category',]
Тогда вам просто нужно передать словарь со всеми этими полями: заголовок, цена, featured, инвентарь и действительный идентификатор категории.