Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django - Slugs - Key (slug)=() is duplicated

Tags:

python

django

just started fooling around with Django and came across a link here on how to create slugs. I was told to perform the following changes to an existing model:

from django.template.defaultfilters import slugify

class Category(models.Model):
    name = models.CharField(max_length=128, unique=True)
    views = models.IntegerField(default=0)
    likes = models.IntegerField(default=0)
    slug = models.SlugField(unique=True)

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

    def __unicode__(self):
        return self.name

This worked out pretty well until I tried to migrate the database using:

python manage.py makemigrations

The above asked for a default value so following the guide, I gave it ''. Then:

python manage.py migrate

The above returned "DETAIL: Key (slug)=() is duplicated."

I'm not entirely sure why this happened. Perhaps it's because I'm adding a new field that is unique and I can't populate it with ''? If so, what do I have to do in order to populate the database?

like image 410
gp04lch Avatar asked Dec 25 '22 17:12

gp04lch


1 Answers

The documentation explains how to migrate in these circumstances. A quick summary:

  • create the field without unique=True
  • create a migration with a RunPython function that iterates through all Categories and calls save on them, which will populate the slug
  • create a final migration which sets unique=True.
like image 93
Daniel Roseman Avatar answered Jan 09 '23 12:01

Daniel Roseman