Почему Django ORM не сохраняет мои объекты

Я создал простой блог с помощью DRF и vue. При попытке сохранить мои Category & Tag Models Django возвращает объекты с null id. Однако при попытке сохранить объекты моих постов все работает нормально.

Кто-нибудь знает, что я делаю неправильно?

class Category(models.Model):
    name = models.CharField(max_length=100, unique=True)
    slug = models.SlugField(max_length=100, unique=True, null=False)
    posts = models.ManyToManyField(Post, related_name='categories', blank=True)

    def __str__(self):
        return self.name

    def save(self, *args, **kwargs): # new
        if not self.slug:
            self.slug = slugify(self.name)

После создания модели я не ожидаю появления id, но после сохранения модели ID должен появиться. Вот оболочка manage.py enter image description here

Я получаю то же самое, если пропустить его через следующий сериализатор.

class TagSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tag
        fields = [
            'id', 'name', 'slug'
        ]

enter image description here

Я получаю те же данные обратно, когда вызываю конечную точку viewset. Как мне заставить django генерировать идентификаторы и сохранять модели? Я пытался сделать это вручную (после воссоздания тестовой базы данных) и результаты были те же. Я также пробовал удалять и восстанавливать миграции с нуля.

Для справки вот модель поста

class Post(models.Model):

    owner = models.ForeignKey(User, on_delete=models.PROTECT)
    title = models.CharField(max_length=100, unique=True)
    slug = models.SlugField(max_length=100, unique=True, null=False)
    body = models.TextField()
    published = models.BooleanField(default=False)
    published_at = models.DateTimeField(blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ['-created_at']

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs): # new
        if not self.slug:
            self.slug = slugify(self.title)
        return super().save(*args, **kwargs)

Вы не сделали вызов super().save(), следовательно, сохранение не вызовет логику сохранения объекта Category в базе данных. Вы должны реализовать это с помощью:

class Category(models.Model):
    # …

    def save(self, *args, **kwargs): # new
        if not self.slug:
            self.slug = slugify(self.name)
        super().save(*args, **kwargs)  # 🖘 save in the database

функция сохранения в вашей модели должна super().save()

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