Django - 我可以改变特定子模型的抽象基础模型中定义的字段的构造吗?

Ben*_*rts 11 django factory django-models

我正在为我的所有模型添加一个slug用于序列化,所以我定义了一个使用django_autoslug中的AutoSlugField的抽象基类.

class SluggerModel(models.Model):
    slug = AutoSlugField(unique=True, db_index=False) 

    class Meta:
        abstract=True
Run Code Online (Sandbox Code Playgroud)

我还定义了一个自定义管理器和一个natural_key方法,此时我有大约20个子类,因此除了定义字段的单行之外,还有一些使得使用抽象基本模型的东西值得.

但是,我希望能够切换一些默认参数来初始化AutoSlugField某些子模型,同时仍然可以使用抽象基类.例如,我希望其中一些人使用该populate_from选项,指定其特定模型中的字段,而其他人则使用db_index=True默认值(False).

我开始尝试使用自定义Metaclass,使用在每个子模型的内部Meta类中定义的自定义选项,但这成为了老鼠的巢.我愿意接受有关该方法的指导,或任何其他建议.

Dan*_*aab 13

一种解决方案是动态构建抽象基类.例如:

def get_slugger_model(**slug_kwargs):
    defaults = {
        'unique': True,
        'db_index': False
    }
    defaults.update(slug_kwargs)

    class MySluggerModel(models.Model):
        slug = AutoSlugField(**defaults)

        class Meta:
            abstract = True

    return MySluggerModel


class MyModel(get_slugger_model()):
    pass


class MyModel2(get_slugger_model(populate_from='name')):
    name = models.CharField(max_length=20)
Run Code Online (Sandbox Code Playgroud)

  • 啊.基础模型工厂!我喜欢.我没有真正考虑过这种模式.比我的元类thingee更清洁和可读 (2认同)