首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django AutoSlugField不考虑Django安全删除软删除的实例

Django AutoSlugField不考虑Django安全删除软删除的实例
EN

Stack Overflow用户
提问于 2020-07-06 17:29:19
回答 1查看 136关注 0票数 1

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

代码语言:javascript
复制
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时生成一个惟一的段塞。

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

Django Safe Delete

Django Autoslug

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

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

问题是,下次我们创建另一个同名为"My Model“的文件时,它会再次自动生成slug "/my-model”,而不考虑已经有一个具有相同名称和slug的文件(已被软删除)。我们需要类似于"/my-model-1“或任何唯一的东西。

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

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

如果这不起作用,我们的变通办法是使用两个字段(名称和id)生成slug。它将生成一个模型,该模型将如下所示:“/my- slug /12345”,并且由于id是唯一的,因此该模型始终是唯一的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-06 19:30:23

我想我们找到了。

我们需要创建一个新的Manager,它可以看到所有实例,甚至是软删除的实例:

代码语言:javascript
复制
class MyModelAllManager(SafeDeleteManager):
_safedelete_visibility = DELETED_VISIBLE

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

代码语言:javascript
复制
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)

这就是魔术。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62753117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档