在模型中,我通常为友好的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是否存在的最佳实践。
发布于 2012-10-19 05:03:52
我不确定这是不是镇上最漂亮的方式,但这应该行得通:
while self.__class__.objects.filter(...):
pass发布于 2012-10-19 05:09:44
在创建SomeModel(SomeAbstractModel)时,只需从头开始创建Meta类,而不继承。通过继承vom SomeAbstractModel.Meta,您可以使其再次抽象,并且您不能在抽象模型上查询,这不是因为它们没有管理器,而是因为没有创建表。
所以你要么这样做:
class SomeModel(SomeAbstractModel):
...
class Meta(SomeAbstractModel.Meta):
abstract=False
... your other model specific options或者执行以下操作(如果您没有任何其他特定于型号的选项:
class SomeModel(SomeAbstractModel):
...https://stackoverflow.com/questions/12963483
复制相似问题