django:更改扩展模型类的默认值

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

首先,在继承的使用中,(至少根据我的测试)不可能更改子类中字段的默认值.MathQuestionQuestion在此处共享相同的字段,更改子类中的默认值会影响父类中的字段.

现在,如果只什么之间不同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)

  • 我在派生类中添加新字段.所以代理类方法不起作用. (2认同)
  • 我并不是试图通过创建新字段来覆盖,只是尝试在 init 方法中设置不同的“值”。这不可行吗? (2认同)
  • 正如我在回答的第一段中提到的,我试过了,它也影响了父类的字段,因为它们共享同一个对象。两个字段的默认值都变为 3。 (2认同)
  • 请在您的回答中准确指出此解决方案不起作用。调用子类的 init 函数也会覆盖超类中的默认值。 (2认同)

val*_*ame 5

上面的示例适用于代理模型。如果您需要更改从非抽象基础模型继承的模型的默认值,您可以执行以下操作:

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(...)