Django 独特的 Slug 按 id

Hel*_*nar 4 django django-models

class Product(models.Model):
    title = models.CharField(max_length=75)

class Deal(models.Model):
    product = models.ForeignKey(Product)
    slug = models.SlugField(max_length=255, unique=True)
Run Code Online (Sandbox Code Playgroud)

具有与上述类似的基本设置,我想使用其交易的产品标题和交易本身的 id 为每个 Deal 实例生成唯一的 slug。IE:交易的id"apple-iphone-4s-161"在哪里161,前面的文字是产品的标题。

为此,我如何覆盖 Deal 模型的 save() 方法来应用它?

jas*_*isz 7

当然,您可以简单地覆盖模型上的 save() 方法(或为 post_save 信号制作接收器)。它会是这样的:

from django.template.defaultfilters import slugify

class Deal(models.Model):
product = models.ForeignKey(Product)
slug = models.SlugField(max_length=255, unique=True)

    def save(self, *args, **kwargs):
        super(Deal, self).save(*args, **kwargs)
        if not self.slug:
            self.slug = slugify(self.product.title) + "-" + str(self.id)
            self.save()
Run Code Online (Sandbox Code Playgroud)

但是这个解决方案的丑陋之处在于它会两次访问数据库(它被保存了两次)。这是因为在创建新的 Deal 对象时,它不会有 id,直到您第一次保存它(并且您不能做太多事情)。