Django外键无法识别关键的主键

时间:2016-08-04 13:32:38

标签: python django django-models django-postgresql

我有两个模型,ArticleArticlePostArticlePost引用Article作为外键,并且位于Article的单独申请中:

====app1/models.py:======
class Article(models.Model):

     name = models.CharField(max_length=200, primary_key=True)

====app2/models.py======
class ArticlePost(models.Model):

    article = models.ForeignKey(Article, null=False, db_index=True)
    created_at = models.DateTimeField(auto_now_add=True)
    comment = models.TextField(blank=True)

我运行了python manage makemigrations,它提供了以下内容:

operations = [
migrations.CreateModel(
    name='ArticlePost',
    fields=[
        ('id', models.AutoField(auto_created=True, verbose_name='ID', serialize=False, primary_key=True)),
        ('created_at', models.DateTimeField(auto_now_add=True)),
        ('comment', models.TextField(blank=True)),
        ('article', models.ForeignKey(to='app2.Article')),
    ],
),
]

然而,当我运行python manage migrate时,我得到:

django.db.utils.ProgrammingError: there is no unique constraint matching given keys for referenced table "article"

奇怪的是,我在app1中有另一个模型,它还引用了一个完全有效的外键文章。但是在这种情况下,似乎Django不知道哪个字段是Article的主键。唯一的区别是ArticlePostArticle的申请不同。我正在运行Django 1.10。有没有人知道造成这种情况的原因以及如何解决这个问题?

或者,如果它只是一个关键问题,可能解决方案是删除文章上的primary_key并使用Django默认id代替。在这种情况下,如何在保持app1中其他模型的外键引用到文章时最好这样做?

2 个答案:

答案 0 :(得分:0)

好的,你试图做的是绝对正确的。但问题在于Django。

当您将name设置为primary_key时,请根据官方文档 - > https://docs.djangoproject.com/ja/1.9/ref/models/fields/#django.db.models.Field.unique

  

primary_key = True表示null = False且unique = True。

从技术上讲,你的Article模型中确实有一个唯一的字段,但是经过Stackoverflow上的其他一些帖子后,

将此视为参考(也可参阅评论) - > Primary key and unique key in django

似乎primary_key=true存在一些问题。 似乎django只将其视为主键,而不是unique

因此,当primary_key=true用于name时,Django 不会创建它拥有对象的唯一自动递增ID。因此,现在您没有模型Article中的对象的任何唯一ID,因此您会收到错误。

因此,只需删除primary_key=true并让Django使用自己的自动递增唯一ID,就不会出现错误。

答案 1 :(得分:-1)

@mohevi,请检查您是否使用 MongoDb 作为数据库,因为 mongodb 不支持外键功能。这些通常在 RDBMS 中得到支持,如 postgresql、MySQL 等