1

我注意到,在大多数情况下,Django 不会在数据库级别强制执行默认值。

模型中的字段定义:

description = models.TextField(default='')

SQL:

description | text   | not null

如果我使用原始 SQL 添加一行(如此处所述:https ://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly ),并且不包含值对于具有默认值的字段,是否仍会使用默认值?

4

1 回答 1

2

不。

至少,不是基于我刚刚做的测试。

模型.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 在创建数据库模式时不会为您设置默认值,它只是在执行正常保存时设置这些默认值。

于 2012-09-14T19:51:54.847 回答