来自外键的 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