Obtendo TypeError: __init __ () faltando 1 argumento posicional obrigatório: 'on_delete' ao tentar adicionar uma tabela pai após a tabela filho com entradas
Eu tenho duas classes em meu banco de dados sqlite, uma tabela pai chamada Categoriee a tabela filho chamada Article. Criei primeiro a classe da tabela filha e adicionei entradas. Então, primeiro eu tinha isso:
E depois de adicionar a tabela pai, agora minha models.pyaparência fica assim:
Então, quando eu corro python manage.py makemigrations <my_app_name>, recebo este erro:
Eu vi alguns problemas semelhantes no stackoverflow, mas parece não ser o mesmo problema: __init __ () faltando 1 argumento posicional obrigatório: 'quantidade'
— Christian Lisangola
qual versão do django você está usando?
Então, o que você está confuso aqui? Como o erro diz claramente, ForeignKey tem um argumento obrigatório on_delete,. Veja a documentação .
— Daniel Roseman de
Não preciso do on_deleteparâmetro, é obrigatório?
@ jochri3 Sim, o argumento posicional requerido significa que é obrigatório. Verifique a documentação para descobrir qual opção se ajusta melhor às suas necessidades.
Você pode alterar a propriedade categorieda classe Articleassim:
e o erro deve desaparecer.
Eventualmente, você pode precisar de outra opção para on_delete, verifique a documentação para obter mais detalhes:
Como você declarou em seu comentário, que não possui requisitos especiais para on_delete, você pode usar a opção DO_NOTHING:
on_delete = models.CASCADE é o padrão no Django <2
Desde Django 2.x, on_deleteé necessário.
Obsoleto desde a versão 1.9: on_delete se tornará um argumento obrigatório no Django 2.0. Em versões anteriores, o padrão é CASCADE.
— Andrey Zhilyakov
Do Django 2.0 on_deleteé necessário:
Ele excluirá os dados da tabela filho se o usuário for excluído. Para mais detalhes, verifique a documentação do Django.
— Javed Gouri
Por que essa resposta enquanto Andrey respondeu antes com essa informação?
Desde o Django 2.0, o campo ForeignKey requer dois argumentos posicionais:
o modelo para mapear
o argumento on_delete
Aqui estão alguns métodos que podem ser usados ​​em on_delete
Exclusões em cascata. O Django emula o comportamento da restrição SQL ON DELETE CASCADE e também deleta o objeto que contém a ForeignKey
Evite a exclusão do objeto referenciado levantando ProtectedError, uma subclasse de django.db.IntegrityError.
Não faça nada. Se o back-end do banco de dados impõe integridade referencial, isso causará um IntegrityError, a menos que você adicione manualmente uma restrição SQL ON DELETE ao campo do banco de dados.
você pode encontrar mais sobre on_delete lendo a documentação .
— Assimitha Deepal
Se você estiver usando a chave estrangeira, você deve usar "on_delete = models.CASCADE", pois isso eliminará a complexidade desenvolvida após a exclusão do elemento original da tabela pai. Tão simples como isso.
— Bala Kiswe
Aqui estão as opções disponíveis se ajudar alguém para on_delete
— Tarun Behal
Post Django versão 1.9, on_deletetornou-se um argumento obrigatório, ou seja, do Django 2.0.
Em versões anteriores, o padrão é CASCADE.
Portanto, se você deseja replicar a funcionalidade que você usou nas versões anteriores. Use o seguinte argumento.
categorie = models.ForeignKey('Categorie', on_delete = models.CASCADE)
Isso terá o mesmo efeito que nas versões anteriores , sem especificá-lo explicitamente.
Documentação oficial sobre outros argumentos que acompanham on_delete
— Optider
Se você não sabe qual opção inserir os parâmetros. Só quero manter o valor padrão como on_delete=Noneantes da migração:
Este é um snippet de código na versão antiga:
— HoangYell
Tive um problema semelhante que foi resolvido adicionando esses dois parâmetros a ForeignKey: null = True, on_delete = models.SET_NULL
— Nir Tsabar
Isso funcionou para mim pip install django-csvimport --upgrade
— cezar de
Oi Mayank. Você provavelmente fez outra coisa para corrigir esse erro ou está usando uma versão anterior do django.
— Chris Dare
Isso é resolvido fornecendo um valor para o argumento "on_delete" para models.ForeignKey
Você está usando o Django anterior à versão 2. Porque todas as versões posteriores tornaram-se on_deleteuma compulsão! Por padrão nas versões anteriores, eraon_delete = models.CASCADE