Django.db.utils.IntegrityError: null значение в столбце "genre_id" отношения "shop_book" нарушает ограничение not-null
Я строю микросервис, у меня есть 2 проекта / 1 БД в Хранилище и 1 БД в Магазине. Когда у меня появляется новая книга в Хранилище, я обновляю БД в Магазине - celery берет эту задачу и делает
Модели на складе и в магазине одинаковые.
У меня возникает странная ошибка, о которой я не могу найти информацию.
Модели:
from django.db import models
from django.urls import reverse
class Author(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
def __str__(self):
return f'{self.first_name} {self.last_name}'
class Genre(models.Model):
name = models.CharField(max_length=50, db_index=True)
slug = models.SlugField(max_length=50, unique=True)
class Meta:
ordering = ('name',)
verbose_name = 'genre'
verbose_name_plural = 'genres'
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('shop:book_list_by_genre', args=[self.slug])
class Book(models.Model):
author = models.ForeignKey('Author', on_delete=models.CASCADE)
genre = models.ForeignKey(Genre,
related_name='books',
on_delete=models.CASCADE)
title = models.CharField(max_length=255)
description = models.TextField(blank=True)
language = models.CharField("language", max_length=20)
pages = models.IntegerField()
image = models.ImageField(upload_to='products/%Y/%m/%d')
slug = models.SlugField(max_length=255)
price = models.DecimalField(max_digits=10, decimal_places=2)
isbn = models.CharField('ISBN', max_length=13,
unique=True)
created = models.DateTimeField(auto_now_add=True)
available = models.BooleanField(default=True)
quantity = models.IntegerField()
class Meta:
ordering = ('title',)
index_together = (('id', 'slug'),)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('shop:book_detail',
args=[self.id, self.slug])
Сельдерей:
TRACEBACK:
-
ваша модель Book
имеет обязательное отношение "один-ко-многим" к Genre
class Book(models.Model):
genre = models.ForeignKey(Genre,
related_name='books',
on_delete=models.CASCADE)
Это означает, что вы должны предоставить значение для genre
в defaults
при создании новых Book
book, created = Book.objects.get_or_create(
id=data['id'],
defaults={
'id': data['id'],
'genre': # value needs to be provided here
Позже код пытается добавить жанры
for i in data['genre']:
genre = Genre.objects.get(id=i)
book.genre.add(genre)
Но этот код запоздал и ожидает, что отношения Book
к Genre
будут отношениями "многие ко многим", когда на самом деле Book
к Genre
определены как отношения "один ко многим"
Придется что-то менять либо в модели данных, либо в скрипте синхронизации.