【问题标题】:Python Django framework: deciding a model field's default value by primary keyPython Django 框架:通过主键确定模型字段的默认值
【发布时间】:2018-01-05 21:12:27
【问题描述】:

在 Django 中,相对于这个模型实例的主键,有没有办法决定我想为模型字段的默认值使用什么样的值? 前任: 如果我有一个 Question 对象,其中有一个字段 question_title 我想要做的就是将此字段设置为:

question_title = models.CharField(max_length=100, default="title")

但我不只是说default="title",而是想说:

default="title"+self.pk

问题是,(至少我认为问题是什么)当类成员在运行时定义时,没有实例化,所以从Python解释器级别,没有办法知道self.pk的值是什么已。

如果是,我尝试实现 init() 函数,但仍然出现类型错误:

class Question(models.Model):

    question_title = models.CharField(max_length=100, default="untitled")
    question_text = models.CharField(max_length=200, default ="content")

    def __init__(self):
        self.question_title = models.CharField(max_length=100, default="title"+str(self.pk))
        self.question_text = models.CharField(max_length=200, default ="content")

    def __str__(self):
        return self.question_title 

错误信息是:

__init__() takes exactly 1 argument (4 given)

【问题讨论】:

  • 发布完整的回溯
  • 为什么不使用模型管理器而不是覆盖 __init__ 。不建议覆盖 init
  • @ArpitSolanki 感谢您提到这一点,正如您所说,该文档似乎很有用docs.djangoproject.com/en/1.11/ref/models/instances
  • 请更新__init__ 方法以匹配超级方法签名def __init__(self, *args, **kwargs):。您可能还想考虑pre_save 信号。
  • 使用 post_save 信号

标签: python django django-models


【解决方案1】:

创建一个默认可调用的方法。

例如:

def get_default_title(instance, text):
    # this goes outside of your model
    title = "%s %s" % (text, instance.id)
    return title


question_title = models.CharField(max_length=100, default=get_default_title)

如果这对你有用,请告诉我。

【讨论】:

  • 它不起作用 - get_default_title 不获取两个参数
猜你喜欢
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 2017-01-28
  • 2012-08-09
  • 2011-02-16
  • 2020-05-14
  • 2018-09-26
相关资源
最近更新 更多