python - Django抽象模型继承

标签 python django model uuid

在模型中,我通常会为友好的 URI 放置一个“uuid”字段,也是一个“slug”字段。

假设我有一个名为“SomeModel”的模型,通过重写其 save() 方法,我可以在保存它时生成一个 uuid 和一个 slug:

class SomeModel(models.Model):
    ...
    def save(self, *args, **kwargs):
        if not self.uuid:
            uuid = shortuuid.uuid()[:10]
            while SomeModel.objects.filter(uuid=uuid).exists():
                uuid = shortuuid.uuid()[:10]
            self.uuid = uuid
        if not self.slug:
            self.slug = slugify(self.title)[:500].rstrip('-')
        super(SomeModel, self).save(*args, **kwargs)

它在常规模型上运行良好。现在我想要一个抽象模型:

class SomeAbstractModel(models.Model):
    class Meta:
        abstract = True
    def save(self, *args, **kwargs):
        ...

然后:

class SomeModel(SomeAbstractModel):
    class Meta(SomeAbstractModel.Meta):
        ...

问题是,在抽象模型中,看起来我不能简单地替换

while SomeModel.objects.filter(uuid=uuid).exists():

while SomeAbstractModel.objects.filter(uuid=uuid).exists():

因为抽象模型没有管理器。

我想知道在这种情况下,如何避免在所有模型的 save() 方法中出现冗余代码。我也不确定是否如此

while SomeModel.objects.filter(uuid=uuid).exists():

是检查 uuid 是否存在的最佳实践。

最佳答案

不确定这是否是镇上最漂亮的方式,但这应该可行:

while self.__class__.objects.filter(...):
    pass

关于python - Django抽象模型继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12963483/

相关文章:

python - 在正则表达式中包含半空格 (\u200c)

python - 如何在 Django 应用程序中手动触发/启动 celery 任务?

javascript - 在我的 Django TextField 中使链接可点击

ruby-on-rails - 找不到 Controller 的操作

node.js - Loopback "Include"过滤器因 hasManyThrough 关系而失败

laravel - 在 Laravel 4 中注册观察者的确切位置

python - Pandas to_sql 所有列为 nvarchar

python - Databricks 连接测试在 "The system cannot find the path specified."上无限期挂起

python - 向 tk.Tk 和 tk.Toplevel 添加方法

python - 使用 django 无限滚动