После переписывания моделей Django для удаления ненужных первичных ключей появилось сообщение об ошибке InvalidCursorName

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

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

Traceback (most recent call last):
  File "C:\Users\fsoar\urban_forest_box\virtualenv\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
psycopg2.errors.UndefinedColumn: column app_species_catalog_nome_popular.id does not exist
LINE 1: ...188_sync_1" NO SCROLL CURSOR WITH HOLD FOR SELECT "app_speci...

Это привело к серии исключений, которые привели к другой серии исключений, последним сообщением об ошибке было:

psycopg2.errors.InvalidCursorName: cursor "_django_curs_17188_sync_1" does not exist

models.py немного длинный, поэтому я вставляю только основную модель этого приложения, которую я использовал для добавления данных, когда это произошло, и которая говорит сама за себя относительно моего уровня владения Python/Django :)

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

# ARVORE

class Img_Arvore(models.Model):
    img_arvore = models.ImageField(upload_to=r'urban_forest_django_project\uploads\img_arvores_completas')

    class Meta:
        verbose_name = "Foto da árvore"
        verbose_name_plural = "Fotos da árvore"

class Arvore(models.Model):          
    nome_cientifico = models.CharField("Nome científico", max_length=200, help_text="Nome científico completo", primary_key=True)
    
    nomes_populares = models.ManyToManyField(Nome_Popular, verbose_name="Nomes populares")
        
    estados_de_conservacaos = (
        ('EX', 'Extinta'),
        ('EW', 'Extinta no ambiente silvestre'),
        ('CR', 'Criticamente em perigo'),
        ('EN', 'Em perigo'),
        ('VU', 'Vulnerável'),
        ('NT', 'Quase ameaçada'),
        ('LC', 'Menos preocupante'),
        ('DD', 'Dados insuficientes'),
        ('NE', 'Não avaliado')
    )
    estado_de_conservacao = models.CharField("Estado de conservação", max_length=50, choices=estados_de_conservacaos)
    
    botanic_description = models.TextField('Descrição botânica', blank=True)
    
    create_date = models.DateTimeField(auto_now_add=True)
    update_date = models.DateTimeField(blank=True, null=True)

    taxonomia = models.OneToOneField(Taxonomia, on_delete=SET_NULL, null=True, blank=True)

    biotipo = models.ForeignKey(Biotipo, on_delete=SET_NULL, null=True, blank=True)
    dendrometria = models.ForeignKey(Dendrometria, on_delete=SET_NULL, null=True, blank=True)
    peculiaridades = models.ForeignKey(Peculiaridade, on_delete=SET_NULL, null=True, blank=True)
    caule = models.ForeignKey(Caule, on_delete=SET_NULL, null=True, blank=True)
    raiz = models.ForeignKey(Raiz, on_delete=SET_NULL, null=True, blank=True)
    folha = models.ForeignKey(Folha, on_delete=SET_NULL, null=True, blank=True)
    flor = models.ForeignKey(Flor, on_delete=SET_NULL, null=True, blank=True)
    fruto = models.ForeignKey(Fruto, on_delete=SET_NULL, null=True, blank=True)

    distribuicao_estadual = models.ManyToManyField(UF_Brasileira, blank=True)
    distribuicao_regional = models.ManyToManyField(Regiao_Brasileira, blank=True)
    dominio_fitogeografico = models.ManyToManyField(Bioma_Brasileiro, blank=True)
    vegetacao_encontrada = models.ManyToManyField(Vegetacao_Brasileira, blank=True)

    maiores_informacoes = models.ForeignKey(Link_Externo, on_delete=SET_NULL, null=True, blank=True)

    class Meta:
        verbose_name = "Árvore"
        verbose_name_plural = "Árvores"
    
    def __str__(self):
        return self.nome_cientifico

Вы также сбросили (удалили) свою базу данных? Ваша база данных меняется с миграциями, поэтому если вы удалите миграции, но не удалите базу данных, база данных будет путаться, потому что она не синхронизирована с вашим приложением django. Попробуйте запустить его на другой базе данных, но не забудьте сделать makemigration, а также migrate.

<<<Вы должны думать о миграциях как о системе контроля версий для схемы вашей базы данных. makemigrations отвечает за упаковку изменений вашей модели в отдельные файлы миграции - аналогично коммитам - а migrate отвечает за применение этих файлов к вашей базе данных.

.

Для получения дополнительной информации : https://docs.djangoproject.com/en/3.2/topics/migrations/

Вернуться на верх