1

在我们的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 安全删除

Django Autoslug

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

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

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

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

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

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

4

1 回答 1

2

我想我们找到了。

我们需要创建一个新的 Manager 来查看所有实例,甚至包括软删除的实例:

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)

这就是魔法。

于 2020-07-06T11:30:22.663 回答