在模型中,我通常会为友好的 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/