У меня уже была база данных, созданная без поля slug
. Я хотел добавить в свою базу данных поле slug unique
. Я прочитал документ django документ о не обнуляемом unqiue slug и просмотрел видео: Мастер-код онлайн .
И вот что я сделал :
- Я создал поле
slug
с параметрами max_length
и blank=True
. - Создано
utils.py
в моей папке project
с функцией unique_slug_generator
. - Выполнить
python manage.py makemigrations
. - Добавлено
RunPython
в перенесенном файле. - Выполнить
python manage.py migrate
. - Снова изменил параметры
slug
на unique=True
и повторил процесс снова.
shop / models.py :
class products(models.Model):
image = models.ImageField(upload_to='products/')
name = models.CharField(max_length=50)
title = models.CharField(max_length=50)
slug = models.SlugField(max_length=150, unique=True)
price = models.FloatField()
def __str__(self):
return self.name
project / utils.py :
from django.utils.text import slugify
import random
import string
def random_string_generator(size):
return ''.join(random.choice(string.ascii_uppercase +
string.ascii_lowercase +
string.digits)
for n in range(size))
def unique_slug_generator(model_instance, name, slug_field):
slug = slugify(name)
model_class = model_instance.__class__
while model_class.objects.filter(slug=slug).exists():
new_slug = "{slug}-{randstr}".format(slug=slug,
randstr=random_string_generator(4)
)
return slug
После первого makemigrations
:
# Generated by Django 3.0.4 on 2020-04-16 17:41
from django.db import migrations, models
from project.utils import unique_slug_generator
def update_slug(apps, schema_editor):
products = apps.get_model('shop', 'products')
for query in products.objects.all():
if not query.slug:
query.slug = unique_slug_generator(query, query.title, query.slug)
query.save()
class Migration(migrations.Migration):
dependencies = [
('shop', '0021_remove_products_slug'),
]
operations = [
migrations.AddField(
model_name='products',
name='slug',
field=models.SlugField(blank=True, max_length=150),
),
migrations.RunPython(update_slug, reverse_code=migrations.RunPython.noop),
]
После второго makemigrations
:
# Generated by Django 3.0.4 on 2020-04-16 17:52
from django.db import migrations, models
from project.utils import unique_slug_generator
def update_slug(apps, schema_editor):
products = apps.get_model('shop', 'products')
for query in products.objects.all():
if not query.slug:
query.slug = unique_slug_generator(query, query.title, query.slug)
query.save()
class Migration(migrations.Migration):
dependencies = [
('shop', '0022_products_slug'),
]
operations = [
migrations.RunPython(update_slug, reverse_code=migrations.RunPython.noop),
migrations.AlterField(
model_name='products',
name='slug',
field=models.SlugField(max_length=150, unique=True),
),
]
Ожидание :
Поле slug
должно сгенерировать автоматическую слизню c в секции admin
после предоставления поля name
.
Наблюдение :
It с указанием обязательного поля слага товар. Где я не прав?