【问题标题】:Django AutoSlugField not considering soft deleted instances by Django Safe DeleteDjango AutoSlugField 不考虑通过 Django Safe Delete 软删除的实例
【发布时间】:2020-10-26 09:41:45
【问题描述】:

在我们的model 中,我们有一个nameslug 字段。看起来是这样的:

class MyModel(CommonInfo, SafeDeleteModel):
   name = models.CharField(_('Name'), max_length=255, null=True, blank=True)
   slug = AutoSlugField(_('Url'), populate_from='name', unique=True,)

对于 slug 字段,我们每次保存 model 时都会生成一个唯一的 slug。

我们还使用Django Safe Delete 库来软删除我们的model

Django Safe Delete

Django Autoslug

这意味着,例如,如果我们创建一个名为“My Model”的model 的新实例,它将自动生成一个slug,如下所示:“/my-model”。

现在假设我们使用slug“/my-model”“软删除”这个实例。在我们的数据库中会有一个属性deleted,其中包含model 被删除的日期。我们没有在我们的应用程序中显示这个,它被完全忽略了(因为它被软删除了,这很好)。

问题是下次我们创建另一个同名“我的模型”时,它会再次自动生成 slug“/my-model”,而不是考虑到已经有一个(被软删除)同名和蛞蝓。我们需要类似“/my-model-1”之类的东西或任何独特的东西。

我们缺少autoslugsafe-delete 库之间的连接,不知何故autoslug 需要知道可能存在软删除的库,并在生成唯一的slug. 时考虑它们

任何帮助都将不胜感激,请考虑到我们在 Django / Python 中是全新的。

如果这不起作用,我们的解决方法是使用 2 个字段(名称和 ID)生成 slug。它将生成一个看起来像这样的slug:“/my-model/12345”,并且始终是唯一的,因为id 是唯一的。

【问题讨论】:

    标签: python django slug soft-delete slugify


    【解决方案1】:

    我想我们找到了。

    我们需要创建一个可以查看所有实例的新管理器,甚至包括软删除的实例:

    class MyModelAllManager(SafeDeleteManager):
    _safedelete_visibility = DELETED_VISIBLE
    

    然后在我们的model 中,我们将它传递给AutoSlugField 函数:

    class MyModel(CommonInfo, SafeDeleteModel):
    
       # We don't know why but it only works if we create a variable and assign the Manager to it. It doesn't work if we pass the Manager directly to the AutoSlugField function.
       all_objects = MyModelAllManager()
    
       name = models.CharField(_('Name'), max_length=255, null=True, blank=True)
       slug = AutoSlugField(_('Url'), populate_from='name', unique=True, manager=all_objects)
    

    这很神奇。

    【讨论】:

      猜你喜欢
      • 2021-04-13
      • 2014-09-09
      • 2013-02-04
      • 1970-01-01
      • 2019-02-21
      • 2015-04-30
      • 1970-01-01
      • 2021-07-28
      • 2018-10-17
      相关资源
      最近更新 更多