1

在模型中,我通常会为友好的 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 是否存在的最佳实践。

4

2 回答 2

3

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

while self.__class__.objects.filter(...):
    pass
于 2012-10-18T21:03:52.477 回答
-1

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

所以要么你这样做:

class SomeModel(SomeAbstractModel):
    ...
    class Meta(SomeAbstractModel.Meta):
        abstract=False
        ... your other model specific options

或者您这样做(如果您没有任何其他特定于模型的选项:

class SomeModel(SomeAbstractModel):
    ...
于 2012-10-18T21:09:43.680 回答