0

我有两个模型,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. 唯一的区别是ArticlePost在不同的应用程序中Article。我正在运行 Django 1.10。有谁知道是什么原因造成的以及如何解决?

或者,如果这只是一个关键问题,也许解决方案是删除primary_keyon Article 并使用 Django 默认值id。在这种情况下,如何最好地做到这一点,同时保持从其他模型到 app1 中文章的外键引用?

4

2 回答 2

0

好的,所以您尝试做的是绝对正确的。但这里的问题在于 Django。

当您根据官方文档进行设置时- name> https://docs.djangoproject.com/ja/1.9/ref/models/fields/#django.db.models.Field.uniqueprimary_key

primary_key=True 意味着 null=False 和 unique=True。

所以从技术上讲,你的Article模型中确实有一个独特的领域,但是在浏览了 Stackoverflow 上的其他几篇文章之后,

将此视为参考(也请查看评论)-> django 中的主键和唯一键

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

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

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

于 2016-08-04T14:51:39.530 回答
-1

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

于 2021-05-13T12:32:56.350 回答