Tango_with_django_17笔记

时间:2023-03-09 13:38:30
Tango_with_django_17笔记

1. 在update Category tabole with SlugField中,起因是url会将空格自动转换成%20,为了把url变得美观,易读,可以用slugify,它可以把空格替换为连字符(‘-’),例如“how do i create a slug in django” 变成了“how-do-i-create-a-slug-in-django”.当然slugify还有其他用法,

Converts to ASCII. Converts spaces to hyphens. Removes characters that aren’t alphanumerics, underscores, or hy-
phens. Converts to lowercase. Also strips leading and trailing whitespace.

slugify

然后我们就需要在model里面的类Category中添加如下:

##put the import top
from django.template.defaultfilters import slugify

##inset the following into the class Category
slug = models.SlugField(default='', unique=True)

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

当我们继续makemigrations,migrate和执行populate脚本文件时,ERROR出现了:

IntegrityError: could not create unique index
"rango_category_slug_key"
DETAIL: Key (slug)=() is duplicated.

啊,电脑开始不按剧本来了,于是我就有了如下尝试:

  1. 删除 unique=True,因为提示无法创建unique索引,然后重新migrate,结果  -----> Fail;
  2. 删除SlugField,尝试回到从前,然后重新migrate,结果  -----> Fail;
  3. 进入admin进行设置,结果  -----> Fail;
  4. 于是我怒了,删除了db,结果  -----> Fail,再migrate,得到的是另一个以前版本的结果,再也回不来了。

于是我bing,SO,都没有具体的解释,后来在一个tango-TaichungPy的文件里找到了解决方法[1](非常感谢作者,感觉我被折磨了一天都没完)。问题产生的原因是什么呢?

就是 unique=True,而替换的name也是unique=True的,但为什么要设置SlugField为unique呢?因为你不想Joel is A Cat和JOEL IS A CAT都被slugify成同一个joel-is-a-cat,所以name时unique的无法保证slug也是unique。

但是如果同时设置,就出错了。解决方法如下:

  1. 去掉model.py中的unique=True;
  2. 删除migrate失败的py文件(在migrations里),就是提示错误之后的py文件都删掉;
  3. 重新migrations和migrate,然后执行populate_rango,这里,因为我们override了save这个method,我觉得需要在populated_rango.py里对category重新save,这时可以进admin查看一下,发现显示如我们所愿了;
  4. 设置SlugField中unique=True;
  5. migrations和migrate

得到的教训是什么呢?在model.py添加新的field时,限制条件要慎重加!!!

一般常见的constraint有:unique=True, blank=False,null=False...

参考文献:

  [1] tango-TaichungPy,作者是*的python爱好者,Excellent!

                                           stay tuned...