поле слизняка к существующей базе данных и уникальный генератор слага - PullRequest
0 голосов
/ 16 апреля 2020

У меня уже была база данных, созданная без поля slug. Я хотел добавить в свою базу данных поле slug unique. Я прочитал документ django документ о не обнуляемом unqiue slug и просмотрел видео: Мастер-код онлайн .

И вот что я сделал :

  1. Я создал поле slug с параметрами max_length и blank=True.
  2. Создано utils.py в моей папке project с функцией unique_slug_generator.
  3. Выполнить python manage.py makemigrations.
  4. Добавлено RunPython в перенесенном файле.
  5. Выполнить python manage.py migrate.
  6. Снова изменил параметры 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 с указанием обязательного поля слага товар. Где я не прав?

...