来自外键的 Django 复合主键的最佳解决方案
best solution for Django Composite primary-key from foreign-keys
我想在 Django SQLite 数据库中满足这种关系(ER Diagram), I have tried using both the unique_together
and models.UniqueConstraint
我见过的建议解决方案。
myapp/models.py
class User(models.Model):
user_id = models.AutoField(primary_key=True, null=False)
class Article(models.Model):
article_id = models.AutoField(primary_key=True)
class ArticleEditor(models.Model):
class Meta:
# RECOMMENDED
models.UniqueConstraint(fields=['article_id', 'editor_id'], name="article_editor_id",)
# DEPRECATED
unique_together = (('article_id', 'editor_id'),)
article_id = models.ForeignKey(
Article,
on_delete=models.CASCADE,
)
editor_id = models.ForeignKey(
User,
on_delete=models.PROTECT,
)
在这两种情况下,当我尝试通过 python 控制台保存 ArticleEditor 对象时,我收到此错误:
>>> from myapp.models import User, Article, ArticleEditor
>>> a = Article.objects.get(article_id=2)
>>> u = User.objects.get(user_id=1)
>>> ae = ArticleEditor(a.article_id, u.user_id)
>>> ae.save()
Traceback (most recent call last):
...
django.db.utils.OperationalError: no such table: myapp_articleeditor
但是,我检查了 sqlmigrate
迁移命令,它 CREATE TABLE "myapp_articleeditor"
;但它仍然会生成一个我不想要的 "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT
,因为我希望我的复合键 (article_editor_id
) 成为主键。我该如何实现?
这实际上是建立具有中间 table 的多对多关系的最佳方式,如图所示,还是有更好的解决方案?
Django 不支持多列主键,建议使用 unique together 解决方法,但您仍然会有一列作为真实 ID
很长一段时间没有关于这个主题的工作Wiki article, django-compositepks
我想在 Django SQLite 数据库中满足这种关系(ER Diagram), I have tried using both the unique_together
and models.UniqueConstraint
我见过的建议解决方案。
myapp/models.py
class User(models.Model):
user_id = models.AutoField(primary_key=True, null=False)
class Article(models.Model):
article_id = models.AutoField(primary_key=True)
class ArticleEditor(models.Model):
class Meta:
# RECOMMENDED
models.UniqueConstraint(fields=['article_id', 'editor_id'], name="article_editor_id",)
# DEPRECATED
unique_together = (('article_id', 'editor_id'),)
article_id = models.ForeignKey(
Article,
on_delete=models.CASCADE,
)
editor_id = models.ForeignKey(
User,
on_delete=models.PROTECT,
)
在这两种情况下,当我尝试通过 python 控制台保存 ArticleEditor 对象时,我收到此错误:
>>> from myapp.models import User, Article, ArticleEditor
>>> a = Article.objects.get(article_id=2)
>>> u = User.objects.get(user_id=1)
>>> ae = ArticleEditor(a.article_id, u.user_id)
>>> ae.save()
Traceback (most recent call last):
...
django.db.utils.OperationalError: no such table: myapp_articleeditor
但是,我检查了 sqlmigrate
迁移命令,它 CREATE TABLE "myapp_articleeditor"
;但它仍然会生成一个我不想要的 "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT
,因为我希望我的复合键 (article_editor_id
) 成为主键。我该如何实现?
这实际上是建立具有中间 table 的多对多关系的最佳方式,如图所示,还是有更好的解决方案?
Django 不支持多列主键,建议使用 unique together 解决方法,但您仍然会有一列作为真实 ID
很长一段时间没有关于这个主题的工作Wiki article, django-compositepks