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

いいえ。

少なくとも、私が行ったテストに基づくものではありません。

models.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 に答える