【问题标题】:UNIQUE constraint failedUNIQUE 约束失败
【发布时间】:2018-11-17 17:36:49
【问题描述】:

我正在使用 Django 进行 Tango,但我无法解决这个练习。 我收到django.db.utils.IntegrityError: UNIQUE constraint failed: rango_category.name 错误。这是在我尝试将views 属性实现到Category 对象之后。这是我的数据库填充脚本的摘录。我想也许我应该makemigrations 然后migrate 来更新数据库的模型。然而,这并没有帮助。

    cats = {
    'Python' : {'pages': python_pages, 'views':128},
    'Django': {'pages': django_pages, 'views':128},
    "Other Frameworks": {'pages':other_pages, 'views':128},
    }

for cat, cat_data in cats.items():
    c = add_cat(cat, cat_data['views'])
    for p in cat_data["pages"]:
        add_page(c, p['title'], p['url'])

for c in Category.objects.all():
    for p in Page.objects.filter(category=c):
        print("- {0} - {1}".format(str(c), str(p)))

def add_cat(name, views):
    c = Category.objects.get_or_create(name=name, views=views)[0]
    c.views=views
    c.save()
    return c

添加Category模型:

class Category(models.Model):
name = models.CharField(max_length=128, unique=True)
views = models.IntegerField(default=0)



class Meta:
    verbose_name_plural = 'Categories'

def __str__(self):
        return self.name

【问题讨论】:

标签: django


【解决方案1】:

您收到错误是因为name = models.CharField(max_length=128, unique=True) 中的unique = True 意味着如果您尝试保存具有相同name 值的新实例,Django 将引发约束错误UNIQUE 约束失败;违反唯一性约束

get_or_create 不起作用,因为 views=views 可能不同,即使 name 等于 name

当您 createget 您的实例时,您只能使用 name 字段来这样做

def add_cat(name, views):
    c = Category.objects.get_or_create(name=name, views=views)[0]
    c.views=views
    c.save()
    return c

【讨论】:

    【解决方案2】:

    如 cmets 中所述,错误是由于违反了 Category.name 上的唯一约束而导致的。然而,发生这种情况的原因可能并不完全明显。当您调用Category.objects.get_or_create 时,您是在要求 django 查找具有给定名称 给定视图数量的对象。如果没有找到,那么 django 会尝试创建一个,如果已经有一个 Category 同名但具有不同数量的视图,则会违反唯一约束。根据所需的行为,您可以通过以下任一方式进行修复:

    • 完全移除唯一约束
    • 将唯一约束更改为unique_together constraint
    • 将模型引用更改为首先按名称获取或创建,然后设置(或修改)视图属性(不要忘记保存)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-09
      • 2017-08-05
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 2020-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多