1

モデルでは、通常、わかりやすい URI の「uuid」フィールドと「slug」フィールドを配置します。

「SomeModel」という名前のモデルがあるとします。その save() メソッドをオーバーライドすることで、保存時に uuid とスラッグを生成できます。

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 に答える