不。
至少,不是基于我刚刚做的测试。
模型.py:
class Recipient(models.Model):
mailing = models.ForeignKey(Mailing, related_name="recipients")
email = models.EmailField()
how_sent = models.CharField(max_length=1, choices=SENT_TYPES, default="U")
user = models.ForeignKey(User, blank=True, null=True)
date_sent = models.DateTimeField(auto_now_add=True)
date_viewed = models.DateTimeField(null=True, blank=True)
def __unicode__(self):
return "%s -> %s (%s)" % (self.mailing, self.email, self.date_sent)
然后我运行这段代码:
>>> cursor.execute("""insert into mailings_recipient (mailing_id, email) values (3, 'test@example.org');""")
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "path/to/django/db/backends/util.py", line 40, in execute
return self.cursor.execute(sql, params)
File "/path/to/django-pyodbc/sql_server/pyodbc/base.py", line 326, in execute
return self.cursor.execute(sql, params)
IntegrityError: ('23000', "[23000] [FreeTDS][SQL Server]Cannot insert the value NULL into column 'how_sent', table 'database.dbo.mailings_recipient'; column does not allow nulls. INSERT fails. (515) (SQLExecDirectW)")
如果 Django 为您输入了默认值,它会发送一个“U”值,how_sent
但我得到了一个错误。
那么如果我们使用 Django 创建一条记录,
Recipient.objects.create(mailing=Mailing.objects.all()[0], email='test@example.org')
这是相应的 SQL:
SET NOCOUNT ON INSERT INTO [mailings_recipient] ([mailing_id], [email], [how_sent], [user_id], [date_sent], [date_viewed]) VALUES (1, test@example.org, U, None, 2012-09-14 14:48:59, None)
;SELECT SCOPE_IDENTITY()
因此,如果您真的问是否会为您输入默认值,如果您使用类似的答案,cursor.execute("INSERT INTO...")
那么答案是否定的,它不会为您设置这些默认值。正如您所指出的,Django 在创建数据库模式时不会为您设置默认值,它只是在执行正常保存时设置这些默认值。