Сгенерировать пустое поле в существующей таблице

#python #django

#python #django

Вопрос:

У меня есть таблица с данными. Возможно ли, что пустое поле автоматически генерируется в существующей таблице? Или есть какая-либо другая альтернатива? Спасибо, вот моя таблица

введите описание изображения здесь

Ответ №1:

Используя slugify фильтр шаблонов, вы можете написать скрипт или перебирать объекты в оболочке.

 >>> from django.template.defaultfilters import slugify
>>> for obj in MyModel.objects.all():
...     obj.slug = slugify(obj.title)
...     obj.save()
 

Комментарии:

1. Я не уверен, что вы имеете в виду. Приведенный выше фрагмент установит пули для всех существующих записей в базе данных. Если вы хотите обновить slug для всех записей, добавленных в будущем, вы можете переопределить метод сохранения — см., Например, Ответ @Tom’s.

2. @ спасибо, но получаю ошибку. NameError: name 'instance' is not defined

3. Спасибо Alasdair, использование AutoSlugField из autoslug с вашей командой экономит мое время

Ответ №2:

У меня есть удобная модель, которую я использую во всех проектах для подобных вещей. Я думаю, что это хороший пример того, как делать то, что вы хотите.

 from django.template.defaultfilters import slugify


class NameAndSlug(models.Model):
    '''
    convenience model for things that are just names
    '''
    name = models.CharField(max_length=200, unique=True)
    slug = models.SlugField()

    def __unicode__(self):
        return self.name

    def save(self, *args, **kwargs):
        """
        Slugify name if it doesn't exist. IMPORTANT: doesn't check to see
        if slug is a dupe!
        """
        if not self.slug:
            self.slug = slugify(self.name)
        super(NameAndSlug, self).save(*args, **kwargs)

    class Meta:
        abstract = True
 

Комментарии:

1. Спасибо. Почему я получаю эту ошибку? ` def __unicode__(self): ошибка отступа: unindent не соответствует ни одному внешнему уровню отступа`

2. Проверьте свои пробелы. У вас слишком много или слишком мало пробелов? Вы смешиваете табуляции и пробелы?

Ответ №3:

Вы можете сделать это в MySQL следующим образом (замените имя вашей таблицы на «tableName»):

 UPDATE `tableName` SET `slug`=LOWER(REPLACE( `title` , ' ' , '-' ));
 

Это изменяет заголовки типа «Это заголовок» на пули типа «this-is-a-title».

РЕДАКТИРОВАТЬ Для обработки круглых скобок и удаления двойных пробелов используйте:

 UPDATE `tableName` SET `slug`=LOWER( REPLACE( REPLACE( REPLACE( REPLACE( `title` , '(' , '' ) , ')' , '' ) , '  ' , ' ' ) , ' ' , '-' ) );
 

Комментарии:

1. Спасибо, но в моем названии также есть parentheses

2. Я также отредактировал, чтобы убрать круглые скобки. Вы можете продолжать вложенную REPLACE(), пока не обработаете все свои целевые символы.

3. Это потрясающе, но я хочу, чтобы пуля состояла из двух столбцов, таких как title и category. тогда каким будет запрос.

4. Я получил ОБНОВЛЕНИЕ решения products SET slug =LOWER( REPLACE( REPLACE( REPLACE( REPLACE(CONCAT( title , ‘-‘, category ) , ‘(‘ , » ) , ‘)’ , » ) , ‘ ‘ , ‘ ‘ ) , ‘ ‘ , ‘-‘ ) );