我有两个模型,Article
和ArticlePost
。 ArticlePost
引用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_key
并使用Django默认id
代替。在这种情况下,如何在保持app1中其他模型的外键引用到文章时最好这样做?
答案 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 等