Почему django inspectdb пропускает некоторые идентификаторы? - PullRequest
1 голос
/ 25 марта 2020

Я запустил inspectdb в моей схеме. Сначала определения очень правильные:

class Diagnosis(models.Model):
    id = models.BigIntegerField(primary_key=True)
    code = models.CharField(max_length=255)
    starting_node = models.ForeignKey('Node', models.DO_NOTHING, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'diagnosis'


class DiagnosisTranslation(models.Model):
    id = models.IntegerField(primary_key=True)
    language = models.CharField(max_length=10)
    title = models.CharField(max_length=255, blank=True, null=True)
    description = models.TextField(blank=True, null=True)
    diagnosis = models.ForeignKey(Diagnosis, models.DO_NOTHING, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'diagnosis_translation'

Затем я добавил последовательности и значения по умолчанию (postgresql) для идентификаторов:

CREATE SEQUENCE diagnosis_id_seq START WITH 100000 INCREMENT BY 1;
ALTER TABLE diagnosis ALTER COLUMN id SET default nextval('diagnosis_id_seq');

CREATE SEQUENCE diagnosis_translation_id_seq START WITH 100000 INCREMENT BY 1;
ALTER TABLE diagnosis_translation ALTER COLUMN id SET default nextval('diagnosis_translation_id_seq');

Я перезапустил python manage.py inspect и результат корректно изменяется для диагностики, но не для другой таблицы, в нем отсутствует атрибут id:

class Diagnosis(models.Model):
    id = models.BigAutoField(primary_key=True)
    code = models.CharField(max_length=255)
    starting_node = models.ForeignKey('Node', models.DO_NOTHING, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'diagnosis'

class DiagnosisTranslation(models.Model):
    # Where's the ID ??
    language = models.CharField(max_length=10)
    title = models.CharField(max_length=255, blank=True, null=True)
    description = models.TextField(blank=True, null=True)
    diagnosis = models.ForeignKey(Diagnosis, models.DO_NOTHING, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'diagnosis_translation'

Почему Django пропускает идентификаторы для некоторых таблиц, а не для других ? Особенно, почему это происходит только тогда, когда я автоматически добавляю поля id?

1 Ответ

1 голос
/ 25 марта 2020

Если вы не определите явно первичный ключ. Django определяет примитивный ключ автоматически [Django -doc] . Таким образом, в этом случае поле добавляется неявно:

<b>id</b> = models.<b>AutoField(</b>primary_key=True<b>)</b>

Django, таким образом, не указывает явно заданный первичный ключ:

  1. первичный ключ имеет имя id; и
  2. первичный ключ имеет тип IntegerField [Django -doc] (AutoField [ Django -doc] - это IntegerField, который автоматически увеличивается в соответствии с доступными идентификаторами.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...