Python Django抽象模型继承

Python Django抽象模型继承,python,django,model,uuid,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]

在一个模型中,我通常为友好的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():

因为抽象模型没有管理器

在本例中,我想知道如何避免在所有模型的save()方法中出现冗余代码。我也不确定

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

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

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

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

所以你要么这样做:

class SomeModel(SomeAbstractModel):
    ...
    class Meta(SomeAbstractModel.Meta):
        abstract=False
        ... your other model specific options
或者您可以这样做(如果您没有任何其他特定于模型的选项:

class SomeModel(SomeAbstractModel):
    ...

Django默认情况下会将abstract设置为False:是的,我知道,但是如果您从SomeAbstractModel.Meta继承,abstract设置为true,因此默认设置是不相关的,这正是为什么SomeModel仍然为False的原因abstract@schacki这是错误的,即使没有你做的元加法,SomeModel仍然不是抽象的
class SomeModel(SomeAbstractModel):
    ...