Python 在Django中,我可以将模型类的后代设置为使用不同的默认值吗?
在django(v1.9)中,有没有一种方法可以设置在基中定义的字段 类在不同的子类中使用不同的默认值Python 在Django中,我可以将模型类的后代设置为使用不同的默认值吗?,python,django,django-models,Python,Django,Django Models,在django(v1.9)中,有没有一种方法可以设置在基中定义的字段 类在不同的子类中使用不同的默认值 class Base(models.Model): OBJ_TYPES = ( ('type_a', 'Type A'), ('type_b', 'Type B'), ('type_c', 'Type C'), ('type_d', 'Type D'), ) obj_type = models.CharFi
class Base(models.Model):
OBJ_TYPES = (
('type_a', 'Type A'),
('type_b', 'Type B'),
('type_c', 'Type C'),
('type_d', 'Type D'),
)
obj_type = models.CharField(choices=OBJ_TYPES, default='type_a')
class GenericChild(Base):
# obj_type defaults to type_a
pass
class TypeDChild(Base)
# Want obj_type to default to type_d
# This causes error (local field clashes...)
obj_type = models.CharField(choices=OBJ_TYPES, default='type_d')
是的,它可以被覆盖,但可能不会以您期望的方式被覆盖。修改后的代码将正常工作:
class Base(models.Model):
OBJ_TYPES = (
('type_a', 'Type A'),
('type_b', 'Type B'),
('type_c', 'Type C'),
('type_d', 'Type D'),
)
obj_type = models.CharField(choices=OBJ_TYPES, default='type_a')
# Make sure you do this, always always always set your base classes to abstract
class Meta:
abstract = True
class GenericChild(Base):
# obj_type defaults to type_a
pass
class TypeDChild(Base)
# Want obj_type to default to type_d
# This causes error (local field clashes...)
# obj_type = models.CharField(choices=OBJ_TYPES, default='type_d')
pass
TypeDChild._meta.get_field('obj_type').default = 'type_d'
如您所见,必须在类定义之后更新默认值。请记住,这可能适用于Django的未来版本,也可能不适用于Django的未来版本,因为它们每隔几个版本就会更新模型内省的工作方式。是的,它可以被覆盖,但可能不会以您期望的方式被覆盖。修改后的代码将正常工作:
class Base(models.Model):
OBJ_TYPES = (
('type_a', 'Type A'),
('type_b', 'Type B'),
('type_c', 'Type C'),
('type_d', 'Type D'),
)
obj_type = models.CharField(choices=OBJ_TYPES, default='type_a')
# Make sure you do this, always always always set your base classes to abstract
class Meta:
abstract = True
class GenericChild(Base):
# obj_type defaults to type_a
pass
class TypeDChild(Base)
# Want obj_type to default to type_d
# This causes error (local field clashes...)
# obj_type = models.CharField(choices=OBJ_TYPES, default='type_d')
pass
TypeDChild._meta.get_field('obj_type').default = 'type_d'
如您所见,必须在类定义之后更新默认值。请记住,这可能适用于Django的未来版本,也可能不适用于Django的未来版本,因为它们每隔几个版本就会更新模型内省的工作方式。默认值可以是可调用的,您可以调用函数检查相关的模型子类型并返回适当的值。@simonecittadini默认值可以是可调用的,但是您没有访问
self
的权限,因此无法检查可调用文件中的子类型。似乎您不能这样做。请看这个问题@JustLive-我想说“不完全一样-我没有覆盖字段,只是覆盖默认值”,但随后思考如何在SQL中执行此操作默认值是列定义的一部分。好的-我想我需要在前端设置/实施它。默认值可以是可调用的,您可以调用一个函数检查相关的模型子类型并返回适当的值。@Simonecittaini默认值可以是可调用的,但您无权访问self
,所以你不能在callable中检查子类型。看起来你不能这样做。请看这个问题@JustLive-我想说“不完全一样-我没有覆盖字段,只是覆盖默认值”,但随后思考如何在SQL中执行此操作默认值是列定义的一部分。好的-我想我需要在前端设置/实施它。