我有两个型号,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管理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管理迁移时,我得到:
django.db.utils.ProgrammingError: there is no unique constraint matching given keys for referenced table "article"
奇怪的是,我在app1
中有另一个模型,它也引用了一篇带有外键的文章,效果很好。然而,在这种情况下,Django似乎不知道哪个字段是Article
的主键。唯一的区别是ArticlePost
与Article
在不同的应用程序中。我正在运行Django 1.10。有人知道是什么导致了这种情况,以及如何解决吗?
或者,如果这只是一个关键问题,也许解决方案是删除Article上的primary_key
,转而使用Django默认的id
。在这种情况下,如何最好地做到这一点,同时在app1中维护从其他模型到文章的外键引用?
好的,所以你尝试做的是绝对正确的。但问题出在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上的其他帖子后,
请将此作为参考(也可以查看注释)->django 中的主键和唯一键
CCD_ 15似乎存在一些问题。django似乎只将其视为一个主键,而不认为它是unique
因此,当您将primary_key=true
用于name
时,Django不会为对象创建它拥有唯一的自动递增id。因此,现在您在模型Article
中没有任何对象的唯一id,因此您会得到所得到的错误。
因此,只需删除primary_key=true
,让Django使用自己的自动递增的唯一id,就不会出现这个错误。
@mohevi,检查您是否使用MongoDb作为数据库,因为MongoDb不支持外键功能。这些通常在RDBMS中得到支持,如postgresql、MySQL等