【问题标题】:django 'DateTimeField' has no default value errordjango 'DateTimeField' 没有默认值错误
【发布时间】:2011-05-10 05:23:24
【问题描述】:

我是 django 开发的新手。我正在创建一个 A 类,它可能分配有多个 B 类:

class A(models.Model):        
    name = models.CharField(max_length=200)    

    def __unicode__(self):
        self.name


class B(models.Model):
    a = models.ForeignKey(A)
    name = models.CharField(max_length=200)
    mydate = models.DateTimeField('party date')

当我尝试在管理页面上创建一个新的“A”元素,并为其创建一个匹配的元素 B 然后 save() 时,我收到警告: 字段 'mydate' 没有默认值

如果我将“mydate”元素移动到 A 类,那么当点击save() 时,我会收到一条消息此字段是来自 Django 的要求,需要我填写该字段!

当日期字段是 B 的一部分时,我怎样才能使这个必需的消息也出现!!!

谢谢

【问题讨论】:

  • 您需要在此处添加更多详细信息以获得好的答案。您如何“创建匹配元素 B”?它是在Asave 方法中完成的,作为post_save 信号的一部分,还是你真的要去B 的管理员添加/更改页面并从那里开始?根据哪种方法,您的问题的答案可能大相径庭。
  • 是的,我试图通过 A 元素 save() 来做到这一点!我不知道 post_save 是什么,但是我假设每个 B 我与 A 一起保存时都会调用它

标签: django django-models django-admin


【解决方案1】:

如果您没有指定,您的字段是可选的,您必须在每次创建对象时为其提供一个值。在你的情况下你不能,所以你必须做这些事情之一:

这里是如何使字段可选:

class B(models.Model):
    a = models.ForeignKey(A)
    name = models.CharField(max_length=200)
    mydate = models.DateTimeField('party date', blank=True, null=True)

以下是设置默认值的方法:

import datetime

class B(models.Model):
    a = models.ForeignKey(A)
    name = models.CharField(max_length=200)
    mydate = models.DateTimeField('party date', default=datetime.datetime.now)

【讨论】:

  • 我也必须搬到 sqlit 才能让它工作!除了你的提议
  • @sramij,无需更改数据库引擎,您只需使用suncdb 重新创建数据库。
【解决方案2】:

Django 中有一个实用函数

from django.utils import timezone
class B(models.Model):
  a = models.ForeignKey(A)
  name = models.CharField(max_length=200)
  mydate = models.DateTimeField('party date', default=timezone.now)

此函数将根据 settings.py 中的 USE_TZ 返回一个日期时间对象

def now():
  """
  Returns an aware or naive datetime.datetime, depending on settings.USE_TZ.
  """
  if settings.USE_TZ:
      # timeit shows that datetime.now(tz=utc) is 24% slower
      return datetime.utcnow().replace(tzinfo=utc)
  else:
      return datetime.now()

【讨论】:

    【解决方案3】:

    据我了解,django 会尝试验证模型 A,然后返回验证错误。由于 A 验证,它尝试写入由于 B 未验证而失败的 A。我不确定如何优雅地执行此操作,但如果您在验证 A 之前尝试自行评估表单 B,您将收到“此字段是必需的”消息,然后您可以将其显示给用户。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 2017-07-31
      • 2016-12-27
      • 2019-07-27
      • 1970-01-01
      相关资源
      最近更新 更多