Neo*_*Neo 13 python django django-models
我刚刚发布了类似的问题,但这个问题有所不同.我有一个相关类的模型结构,如:
class Question(models.Model):
ques_type = models.SmallIntegerField(default=TYPE1, Choices= CHOICE_TYPES)
class MathQuestion(Question):
//Need to change default value of ques_type here
// Ex: ques_type = models.SmallIntegerField(default=TYPE2, Choices= CHOICE_TYPES)
Run Code Online (Sandbox Code Playgroud)
我想更改派生类中的ques_type的默认值.我该怎么做到这一点?
Rei*_*cke 13
首先,在继承的使用中,(至少根据我的测试)不可能更改子类中字段的默认值.MathQuestion并Question在此处共享相同的字段,更改子类中的默认值会影响父类中的字段.
现在,如果只什么之间不同MathQuestion并且Question是行为(所以,MathQuestion不添加除了那些在定义的任何字段Question),那么你可以把一个代理模型.这样,就不会为其创建数据库表MathQuestion.
from django.db import models
class Question(models.Model):
ques_type = models.SmallIntegerField(default=2)
class MathQuestion(Question):
def __init__(self, *args, **kwargs):
self._meta.get_field('ques_type').default = 3
super(MathQuestion, self).__init__(*args, **kwargs)
class Meta:
proxy = True
Run Code Online (Sandbox Code Playgroud)
测试:
In [1]: from bar.models import *
In [2]: a=Question.objects.create()
In [3]: a.ques_type
Out[3]: 2
In [4]: b=MathQuestion.objects.create()
In [5]: b.ques_type
Out[5]: 3
Run Code Online (Sandbox Code Playgroud)
上面的示例适用于代理模型。如果您需要更改从非抽象基础模型继承的模型的默认值,您可以执行以下操作:
from django.db import models
class Base(models.Model):
field_name = models.CharField(...)
class Child(Base):
def __init__(self, *args, **kwargs):
kwargs['field_name'] = kwargs.get('field_name') or 'default value'
super().__init__(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
如果没有直接传递给Model(...)or ,它将设置默认值Model.objects.create(...)。
| 归档时间: |
|
| 查看次数: |
8904 次 |
| 最近记录: |