首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django抽象模型继承

Django抽象模型继承
EN

Stack Overflow用户
提问于 2012-10-19 04:48:08
回答 2查看 639关注 0票数 1

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

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

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

它在常规模型上工作得很好。现在我想要一个抽象的模型:

代码语言:javascript
复制
class SomeAbstractModel(models.Model):
    class Meta:
        abstract = True
    def save(self, *args, **kwargs):
        ...

然后:

代码语言:javascript
复制
class SomeModel(SomeAbstractModel):
    class Meta(SomeAbstractModel.Meta):
        ...

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

代码语言:javascript
复制
while SomeModel.objects.filter(uuid=uuid).exists():

使用

代码语言:javascript
复制
while SomeAbstractModel.objects.filter(uuid=uuid).exists():

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

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

代码语言:javascript
复制
while SomeModel.objects.filter(uuid=uuid).exists():

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-19 05:03:52

我不确定这是不是镇上最漂亮的方式,但这应该行得通:

代码语言:javascript
复制
while self.__class__.objects.filter(...):
    pass
票数 3
EN

Stack Overflow用户

发布于 2012-10-19 05:09:44

在创建SomeModel(SomeAbstractModel)时,只需从头开始创建Meta类,而不继承。通过继承vom SomeAbstractModel.Meta,您可以使其再次抽象,并且您不能在抽象模型上查询,这不是因为它们没有管理器,而是因为没有创建表。

所以你要么这样做:

代码语言:javascript
复制
class SomeModel(SomeAbstractModel):
    ...
    class Meta(SomeAbstractModel.Meta):
        abstract=False
        ... your other model specific options

或者执行以下操作(如果您没有任何其他特定于型号的选项:

代码语言:javascript
复制
class SomeModel(SomeAbstractModel):
    ...
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12963483

复制
相关文章

相似问题

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