#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
SETslug
=LOWER( REPLACE( REPLACE( REPLACE( REPLACE(CONCAT(title
, ‘-‘,category
) , ‘(‘ , » ) , ‘)’ , » ) , ‘ ‘ , ‘ ‘ ) , ‘ ‘ , ‘-‘ ) );