Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django中,我可以将模型类的后代设置为使用不同的默认值吗?_Python_Django_Django Models - Fatal编程技术网

Python 在Django中,我可以将模型类的后代设置为使用不同的默认值吗?

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

在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.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中执行此操作默认值是列定义的一部分。好的-我想我需要在前端设置/实施它。