Лучшее решение для первичного ключа Django Composite из внешних ключей

Я хочу удовлетворить эту связь в базе данных Django SQLite (ER-диаграмма ), я пытался использовать модели unique_together и . Решения 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,
    )

В обоих случаях, когда я пытаюсь сохранить объект ArticleEditor через консоль Python, я получаю эту ошибку:

>>> 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) был первичным ключом. Как мне этого добиться?

И действительно ли это лучший способ создать отношение «многие ко многим» с промежуточной таблицей, как показано на диаграмме, или есть лучшее решение?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
1 027
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Django не поддерживает первичный ключ с несколькими столбцами, предлагается обходной путь, уникальный вместе, но у вас все равно будет один столбец, который будет действовать как настоящий идентификатор.

Работа по этой теме давно не ведется Вики-статья , django-compositepks

Другие вопросы по теме