我有很多领域的模型。对于大量的这些字段(例如大约20个字段),但并非所有字段我都希望自动创建一个双BooleanField
。
一些要求:
- 字段的类型不同(例如
CharField
,DateField
,...) - 将来会添加新字段,这就是为什么我要创建此通用解决方案的原因,所以我只需添加主字段并将其标记为添加双胞胎
- 理想情况下,我希望能够使用相同的ORM语法进行过滤,例如,如果我手动定义了布尔双胞胎
- 大多数时候只需要字段本身,很少是布尔双胞胎
给出以下模型
from django.db.models import model
class MyModel(models.Model):
ignore_field = models.Charfield(max_length=10)
my_field = models.Charfield(max_length=30)
我想自动添加字段:
is_fixed_my_field = models.BooleanField(default=False)
我所考虑的:
我看到的这种方法的问题是,我将需要为每种字段类型手动定义这样的复合字段,而且我不确定是否可以传递kwargs。另外,我认为我不能保留查询的默认语法。相反,我必须在每个过滤器中添加此附加级别。
class FixedField(CompositeField):
value = models.Charfield() # could I even add the kwargs?
is_fixed = models.BooleanField()
class MyModel(models.Model):
ignore_field = models.Charfield(max_length=10)
my_field = FixedField()
2。 custom fields 我的梦想是创建一个自定义字段,如下所示:
class MyModel(models.Model):
ignore_field = models.Charfield(max_length=10)
my_field = FixableField(models.Charfield,max_length=30)
MyModel.objects.filter(is_fixed_my_field=True)
m = MyModel(my_field="foo")
print(m.is_fixed_my_field) # False
显然,它不适用于类似的东西
class FixableField:
def __init__(self,model,field_class: models.Field,*args,**kwargs):
setattr(model,f"is_fixed_{cannot_get_the_field_name}",models.BooleanField)
field_class(*args,**kwargs)
因为据我所知,该类在迁移生成期间并未真正实例化。
我的梦想有可能吗?
注意1:我在后台使用postgres。
注2:我当前正在使用Django 1.11,但如果解决方案仅适用于更新版本,我也对此感兴趣。