Django->IntegrityError при создании записи с присвоенным ей внешним ключом модели
Сейчас я прохожу курс по Django API и последний мой проект - создание API для ресторана Little Lemon. Я скачал исходный код того же проекта и теперь реализую его на своей стороне. Сейчас я застрял на проблеме уже 2 дня, пробовал chatgpt, stack-overflow, но конкретных решений нет. Проблема в том, что я не могу вставить меню в DB. Потому что он выдает ошибку
IntegrityError at /api/menu-items NOT NULL constraint failed: LittleLemonAPI_menuitem.category_id
**Эта ошибка возникает, когда я пытаюсь вставить пункт меню с помощью Insomia. Но если я создаю тот же пункт с помощью Super User, он создается.
Это мой взгляд.**
class MenuItemListView(generics.ListCreateAPIView):
queryset = MenuItem.objects.all()
serializer_class = MenuItemSerializer
def get_permissions(self):
permission_classes = [IsAuthenticated]
if self.request.method != 'GET':
permission_classes = [IsAuthenticated, IsManager | IsAd
Это моя модель:
class MenuItem(models.Model):
title = models.CharField(max_length=255)
price = models.DecimalField(max_digits=10, decimal_places=2)
featured = models.BooleanField(db_index=True)
category = models.ForeignKey(Category, on_delete=models.PROTECT)
class Meta:
unique_together = [['title', 'category']]
def __str__(self):
return self.title
Это мой сериализатор
class MenuItemSerializer(serializers.ModelSerializer):
def validate_category(self, value):
try:
Category.objects.get(pk=value)
return value
except Category.DoesNotExist:
raise serializers.ValidationError('Invalid category ID.')
class Meta:
model = MenuItem
fields = ['id', 'title', 'price', 'featured', 'category']
depth = 1
Вот мой Json-запрос:
{
"title": "Spring Rolls",
"price": "5.99",
"featured": true,
"category": 1
}
NOTE: Я создал категорию с помощью API, но когда я пытаюсь создать пункт меню, он выдает эту ошибку. из-за ограничения первичного ключа.
Я устал удалять миграцию и промывать данные и перезапустил процесс, но получил тот же результат.
Я также попробовал обратиться в chatgpt, но это не дало мне никакого конкретного решения.
когда я пытаюсь создать меню-элемент с помощью суперпользователя, он создается.
но когда я пытаюсь создать меню-элемент с помощью API, он дает мне
IntegrityError at /api/menu-items NOT NULL constraint failed: LittleLemonAPI_menuitem.category_id
class MenuItemSerializer(serializers.ModelSerializer):
category = serializers.SlugRelatedField(slug_field='id', queryset=Category.objects.all())
class Meta:
model = MenuItem
fields = ['id', 'title', 'price', 'featured', 'category']
depth = 1
я только что получил ответ от ChatGPT, вам придется изменить сериализаторы для обработки id категории.
Поле SlugRelatedField - это поле, которое представляет цель отношения с помощью атрибута "slug". В данном контексте "slug" может быть любым полем в связанной модели, которое уникально идентифицирует экземпляры связанного режима. Здесь указывается, какое поле связанной модели (Category) должно использоваться в качестве "slug" для представления. Здесь используется поле id модели Category. Это означает, что при сериализации экземпляра MenuItem поле category будет представлено полем id связанного экземпляра Category.