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 определены как отношения "один ко многим"

Придется что-то менять либо в модели данных, либо в скрипте синхронизации.

Вернуться на верх