我有以下型号:
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 shell中但:
>>>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,迁移和迁移--run-syncdb。 Django 1.9.12,sqlite3
答案 0 :(得分:2)
在数据库级别强制执行唯一约束。您没有收到任何错误,可能是因为SQLite不支持这种类型的约束。您无法在SQLite中向现有表添加约束。如果您处于早期开发阶段,请删除表并使用更新的约束重新创建它。然后它应该在shell中正常工作。
检查SQLite alter table docs是否允许在现有表上进行更新。
管理表单会抛出错误,因为它会自行检查唯一性,而不依赖于数据库约束。