Django Integrity Error: NOT NULL Constraint failed. How to fix?

I am new in django. I am weak of Relational Serialization. Please help me to solve the following problem.

Problem: I want to create model, serializers and all the neccessary code. Basically I want to solve course sera project assesment of API course. When I run my code and test, I saw an error raised: django.db.utils.IntegrityError: NOT NULL constraint failed: LittleLemonAPI_menuitem.category_id

It is occured when I define depth =1 in MenuItemSerializer and create a new menu item. If I remove depth = 1 and category = CategorySerializer; there is no error happend. But then category table data is not populated.

Below I add my neccessary code:

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

I am trying to add menu items but when I assign depth = 1 then avobe error is occured.

Error: django.db.utils.IntegrityError: NOT NULL constraint failed: LittleLemonAPI_menuitem.category_id

This error is telling you that you have to provide a category id when you create a menu item.

And the other error is using depth in a write serializer. Removing that and the category in the Meta you should be fine.

With this serializer:

class MenuItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = MenuItem
        fields = ['id', 'title', 'price',
                  'featured', 'inventory', 'category',]

Then you just have to pass a dictionary with all these fields: title, price, featured, inventory and a valid category id.

Back to Top