Django 1.5.1 を使用しています。パイソン 2.7.3。
外部キー フィールドとスラッグ フィールドを使用して、一緒に一意の制約を実行したいと考えていました。だから私のモデルのメタでは、私はやった
foreign_key = models.ForeignKey("self", null=True, default=None)
slug = models.SlugField(max_length=40, unique=False)
class Meta:
unique_together = ("foreign_key", "slug")
Postgres (9.1) でテーブルの説明を確認したところ、データベース テーブルに制約が設定されていました。
-- something like
"table_name_foreign_key_id_slug_key" UNIQUE CONSTRAINT, btree (foreign_key_id, slug)
ただし、None/null のforeign_key と重複した文字列をデータベース テーブルに保存することはできます。
例えば、
入力して保存できました
# model objects with slug="python" three times; all three foreign_key(s)
# are None/null because that is their default value
MO(slug="python").save()
MO(slug="python").save()
MO(slug="python").save()
では、unique_together を使用した後でも、同じ値の行を 3 つ入力できるのはなぜでしょうか?
unique_together の前に、slug で unique=True を使用したとき、すべてが正常に機能したためです。その場合、null 値を示すだけでなく、一意の制約を維持するデフォルト値は何を設定すればよいでしょうか?