【问题标题】:use unique id in django model custom save在 django 模型自定义保存中使用唯一 ID
【发布时间】:2017-09-27 20:35:31
【问题描述】:

我正在尝试从人名中创建独特的 slug,这将有明显的重复。我的想法是将 id 作为唯一标识符添加到 slug 中。问题是在保存完成之前不会生成唯一 ID。

这是我尝试过的:

def save(self, *args, **kwargs):

        if getattr(self, 'name', True):

            if not self.pk:
                matching_slugs = Entity.objects.filter(slug=slugify(self.name))
                print matching_slugs
                if len(matching_slugs) > 0:
                    self.slug=slugify(self.name+' temp')
                elif len(matching_slugs) == 0:
                    self.slug=slugify(self.name)
        super(Entity, self).save(*args, **kwargs)
        self.slug=slugify(self.name+' '+str(self.id))
        self.save()

我得到错误:

在 cmp 中超出最大递归深度

我认为这不是最好的方法。

如何在保存时使名称唯一?

【问题讨论】:

  • 删除self.save()
  • 但是为什么你不使用docs.djangoproject.com/en/1.11/ref/models/fields/#slugfieldunique=True
  • 您是特别需要 slug 为 name + pk 还是只需要一个独特的 slug?如果你告诉我们你想如何使用这个 slug 可能会有所帮助。
  • @AndMar 是正确的 self.save() 是递归错误的原因,但看起来你想使用 self.id 直到对象第一次保存才设置所以我可以看看你为什么要保存它两次。这篇文章可能有助于保存一个对象两次:stackoverflow.com/a/14236946/1051031

标签: python django django-models


【解决方案1】:

你可以使用简单的构造吗?:

import uuid


def save(self, *args, **kwargs):
    if not self.slug:
          self.slug = "%s.%s" % (self.name , uuid.uuid4())
    super(Entity, self).save(*args, **kwargs)

【讨论】:

  • 谢谢。它为另一个目的拯救了我。好问题,好答案。 :)
【解决方案2】:

我将 save() 更改为:

    super(Entity, self).save(*args, **kwargs)
    self.slug=slugify(self.name+' '+str(self.id))
    super(Entity, self).save(*args, **kwargs)

【讨论】:

    猜你喜欢
    • 2013-07-12
    • 2011-01-14
    • 2019-10-18
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 2013-07-16
    • 2020-08-23
    相关资源
    最近更新 更多