0

私は以下のモデルを持っています:

class Property(models.Model):
    job = models.ForeignKey(Job, on_delete=models.CASCADE)
    app = models.ForeignKey(App, on_delete=models.CASCADE)
    name = models.CharField(max_length=120)
    value = models.CharField(max_length=350, blank=True)
    description = models.TextField(blank=True)
    pub_date = models.DateTimeField('date_published', default=timezone.now)

    class Meta:
        verbose_name_plural = "properties"
        unique_together = (('value', 'name'),)

    def __str__(self):
        return self.name

管理ページ (私は Django Suit を使用しています) で、既に存在する名前/値を使用して Property オブジェクトを作成しようとすると、「この値と名前を持つプロパティは既に存在します。」という例外が発生します。だからそれは完璧に機能します。

しかし、manage.py シェルでは:

>>>from myapp.models import App, Property, Job
>>>from django.shortcuts import get_object_or_404
>>>app = get_object_or_404(App, app_name='BLABLA')
>>>job = get_object_or_404(Job, job_name='BLABLA2')
>>> Property.objects.create(job=job, app=app, name='1', value='1')
<Property: 1>
>>> Property.objects.create(job=job, app=app, name='1', value='1')
<Property: 1>

この場合、例外は発生せず、オブジェクトがデータベースに追加されます。

makemigrations、migrate、migrate --run-syncdb を試しました。ジャンゴ 1.9.12、sqlite3

4

1 に答える 1

2

一意の制約は、データベース レベルで適用されます。おそらく SQLite がこのタイプの制約をサポートしていないため、エラーは発生しません。SQLite の既存のテーブルに制約を追加することはできません。開発の初期段階にある場合は、テーブルを削除し、更新された制約で再作成します。その後、シェルで正常に動作するはずです。

既存のテーブルで許可されている更新については、SQLite alter table ドキュメントを確認してください。

管理フォームは、データベースの制約に依存せずに独自に一意性をチェックするため、エラーをスローします。

于 2017-03-29T23:09:07.300 に答える