如果数据库中已经存在索引,如何将索引添加到我的子弹中?

时间:2019-05-25 11:07:39

标签: python django slugify

当我创建新帖子时,我需要下一步:

1. Generate slug from self.title with slugify
2. Check if this slug does not exists we save post with self.slug
3. If this slug already exists we save post with self.slug + '-' + count index

我找到了可行的解决方案,但我是django的新手,所以我想问问您这是最佳的解决方案吗?

#models.py

from django.db import models
from django.shortcuts import reverse
from django.utils.text import slugify
from django.db.models.signals import post_save
from django.dispatch import receiver

class Post(models.Model):
    title = models.CharField(max_length=150, db_index=True)
    slug = models.SlugField(max_length=150, blank=True, unique=True)

    def get_absolute_url(self):
        return reverse('post_detail_url', kwargs={'slug': self.slug})

@receiver(post_save, sender=Post)
def set_slug(sender, instance, *args, **kwargs):
    if not instance.slug:
        instance.slug = slugify(instance.title)
        while Post.objects.filter(slug__startswith=instance.slug).exists():
            instance.slug += '-' + str(Post.objects.filter(slug__startswith=instance.slug).count())
        instance.save()

1 个答案:

答案 0 :(得分:0)

pre-save signal是解决此问题的最佳方法。每次实例将要保存时,信号都会被触发并运行一些逻辑。在这种情况下,它将在保存之前填充子弹字段。

from django.db.models.signals import pre_save
from django.dispatch import receiver

# you other stuff goes here

@receiver(pre_save, sender=MyModel)
def set_slug(sender, instance, *args, **kwargs):
    instance.slug = slugify(instance.title)

就是这样!

如果您的信号未在应用程序周围连接,则可以将其放置在models.py上。但是,如果您使用它来连接不同的应用程序,或者将一个公共信号连接到多个应用程序,则应该放置一个单独的文件。

仅需注意:看到sender=MyModel件吗?那就是将信号绑定到特定模型。如果您有很多将使用子弹的模型,则可以删除它以使预保存钩子可用于多个模型。