【问题标题】:unique_together does not work in Django shellunique_together 在 Django shell 中不起作用
【发布时间】:2017-08-23 15:38:43
【问题描述】:

我有以下型号:

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)中创建一个名称/值已经存在的属性对象时,我收到异常:“具有此值和名称的属性已经存在。”所以它工作得很好。

但是在 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、migrate 和 migrate --run-syncdb。 Django 1.9.12,sqlite3

【问题讨论】:

  • @viviwill 你不需要在create()之后调用save()

标签: django django-shell


【解决方案1】:

唯一约束在数据库级别强制执行。您没有收到任何错误可能是因为 SQLite 不支持这种类型的约束。您不能在 SQLite 中向现有表添加约束。如果您处于早期开发阶段,请删除表并使用更新的约束重新创建它。然后它应该可以在 shell 中正常工作。

检查SQLite alter table docs 是否允许对现有表进行更新。

管理表单抛出错误,因为它自己检查唯一性而不依赖于数据库约束。

【讨论】:

    猜你喜欢
    • 2011-11-23
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多