Django не распознает конкретное c изменение в модели - PullRequest
1 голос
/ 05 января 2020
class Category(models.Model):
    name = models.CharField(max_length=128 , unique=True)
    views = models.IntegerField(default=0)
    likes = models.IntegerField(default=0)

    # we override save so as to convert name to a slug
    ### essentially -> name.lower().replace(" " , "-")

    def save(self,*args,**kwargs):
        self.slug = slugify(self.name)
        super(Category, self).save(*args, **kwargs)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = "Categories"

Переопределение сохранения не регистрируется. При попытке запустить makemigrations.

появляется сообщение "В приложении не обнаружено изменений" . Я попытался внести изменения в другие методы, и эти изменения распознаются.

Что может быть причиной этого?

Ответы [ 2 ]

1 голос
/ 05 января 2020

Миграции только для базы данных изменений; Ваше переопределение в методе сохранения не будет иметь ничего общего с базой данных (например, добавление нового поля и т. Д. c.), Поэтому оно не будет генерировать никаких миграций.

0 голосов
/ 05 января 2020

Миграции вносят изменения в базу данных. Переопределение методов, добавление свойств, определение новых методов и т. Д. c. все находится на уровне Python / Django и не имеет ничего отношения к базе данных, следовательно, для этого не требуется никаких миграций. Как бы вы изменили базу данных с помощью нового метода .save(..)?

Если вам нужно заполнить существующие записи, вы можете создать миграцию данных [Django - документ] . Вы можете создать такую ​​миграцию с помощью:

python manage.py makemigrations <b>--empty</b> <i>appname</i>

и затем указать способ миграции (например, вручную итерируя свои записи и каждый раз вычисляя слаг).

Обратите внимание, что ваш Однако модель Category также имеет поле no slug, что означает, что self.slug = &hellip; не очень полезен. Вы добавите атрибут .slug к вашему объекту модели. Но как только этот объект больше не находится в памяти, эти данные больше не доступны. Более того, вы не можете искать в slug, так как слаг не хранится в базе данных.

Возможно, вы захотите взглянуть на пакет django-autoslug [ readthedocs] . Это позволяет вам определить AutoSlugField и просто указать, как его заполнить. Кроме того, этот пакет будет пытаться найти уникальный слаг, ведь в противном случае другое имя, строго говоря, может привести к тому же слагу.

from autoslug import <b>AutoSlugField</b>

class Category(models.Model):
    name = models.CharField(max_length=128 , unique=True)
    <b>slug = AutoSlugField(populate_from='name')</b>
    views = models.IntegerField(default=0)
    likes = models.IntegerField(default=0)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = "Categories"
...