Django AutoSlugField 不考虑 Django Safe Delete 的软删除实例
Django AutoSlugField not considering soft deleted instances by Django Safe Delete
在我们的 model
中,我们有一个 name
和 slug
字段。这是它的样子:
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
:
这意味着,例如,如果我们创建一个名称为“我的模型”的 model
的新实例,它将自动生成一个如下所示的 slug
:“/my-model ".
现在假设我们使用slug
“/my-model”“软删除”这个实例。在我们的数据库中将有一个 属性 deleted
包含 model
被删除的日期。我们没有在我们的应用程序中显示这个,它被完全忽略了(因为它被软删除了,没关系)。
问题是下次我们创建另一个同名“我的模型”时,它会再次自动生成 slug“/my-model”,而不考虑已经有一个(被软删除)具有相同的名称和鼻涕虫。我们需要诸如“/my-model-1”之类的东西或任何独特的东西。
我们缺少 autoslug
和 safe-delete
库之间的联系,autoslug
需要知道可能存在软删除的库并在生成唯一库时考虑它们slug.
任何帮助将不胜感激,请考虑我们在 Django 中是全新的/Python。
如果这不起作用,我们的解决方法是使用 2 个字段(名称和 ID)生成 slug
。它将生成一个 slug
,看起来像这样:“/my-model/12345”并且将始终是唯一的,因为 id
是唯一的。
我想我们找到了。
我们需要创建一个可以查看所有实例的新管理器,甚至是软删除的实例:
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)
这很神奇。
在我们的 model
中,我们有一个 name
和 slug
字段。这是它的样子:
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
:
这意味着,例如,如果我们创建一个名称为“我的模型”的 model
的新实例,它将自动生成一个如下所示的 slug
:“/my-model ".
现在假设我们使用slug
“/my-model”“软删除”这个实例。在我们的数据库中将有一个 属性 deleted
包含 model
被删除的日期。我们没有在我们的应用程序中显示这个,它被完全忽略了(因为它被软删除了,没关系)。
问题是下次我们创建另一个同名“我的模型”时,它会再次自动生成 slug“/my-model”,而不考虑已经有一个(被软删除)具有相同的名称和鼻涕虫。我们需要诸如“/my-model-1”之类的东西或任何独特的东西。
我们缺少 autoslug
和 safe-delete
库之间的联系,autoslug
需要知道可能存在软删除的库并在生成唯一库时考虑它们slug.
任何帮助将不胜感激,请考虑我们在 Django 中是全新的/Python。
如果这不起作用,我们的解决方法是使用 2 个字段(名称和 ID)生成 slug
。它将生成一个 slug
,看起来像这样:“/my-model/12345”并且将始终是唯一的,因为 id
是唯一的。
我想我们找到了。
我们需要创建一个可以查看所有实例的新管理器,甚至是软删除的实例:
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)
这很神奇。