Estou tendo problemas para carregar acessórios Django em meu banco de dados MySQL por causa de conflitos de tipo de conteúdo. Primeiro tentei despejar os dados apenas do meu aplicativo, desta forma:
./manage.py dumpdata escola > fixture.json
mas não parava de ter problemas de chave estrangeira, pois meu app "escola" usa tabelas de outros aplicativos. Continuei adicionando aplicativos até chegar a este:
./manage.py dumpdata contenttypes auth escola > fixture.json
Agora, o problema é a seguinte violação de restrição quando tento carregar os dados como um dispositivo de teste:
IntegrityError: (1062, "Duplicate entry 'escola-t23aluno' for key 2")
Parece que o problema é que o Django está tentando recriar dinamicamente contenttypes com diferentes valores de chave primária que entram em conflito com os valores da chave primária do fixture. Parece ser o mesmo bug documentado aqui: http://code.djangoproject.com/ticket/7052
O problema é que a solução alternativa recomendada é descartar o aplicativo contenttypes, o que já estou fazendo !? O que da? Se fizer alguma diferença, tenho algumas permissões de modelo personalizado, conforme documentado aqui: http://docs.djangoproject.com/en/dev/ref/models/options/#permissions
-e contenttypes -e auth.permission
com--natural
? Eu apenas tentei sem a--natural
opção e funcionou. Além disso, a documentação aqui diz que se deve usar esta opção se DUMPINGauth.permission
econtenttypes
.ContentType
ePermission
não tem garantia de obter o mesmo id que tinha antes. Seu dump de dados contém ids que podem fazer referência a diferentes objetos em outro banco de dados onde você irá carregar os dados. Pode funcionar para você por um destes motivos: 1) seus dados não tinham nenhuma referência a esses objetos 2) IDs originais de Permission / ContentTypes foram preservados 3) seu loaddata foi bem-sucedido, mas na verdade você tem dados corrompidos devido a objetos referindo-se a objetos errados e você ainda não sabe sobre isso--natural
foi descontinuada em favor de--natural-foreign
(e--natural-primary
)manage.py dumpdata --natural-foreign --natural-primary -e contenttypes -e auth.Permission --indent 4 > project_dump.json
--natural
agora foi completamente removido, não apenas obsoleto. Use--natural-foreign
ou em seu--natural-primary
lugar.Sim, isso é realmente irritante. Por um tempo, resolvi fazer um "manage.py reset" no aplicativo contenttypes antes de carregar o fixture (para me livrar dos dados contenttypes gerados automaticamente que diferiam da versão despejada). Isso funcionou, mas eventualmente eu cansei dos aborrecimentos e abandonei os acessórios inteiramente em favor de dumps SQL diretos (é claro, então você perde a portabilidade do banco de dados).
atualizar - a melhor resposta é usar o
--natural
sinalizador paradumpdata
, conforme observado em uma resposta abaixo. Essa bandeira ainda não existia quando escrevi esta resposta.fonte
Tente pular contenttypes ao criar fixture:
Funcionou para mim em uma situação semelhante para testes de unidade, sua visão sobre os tipos de conteúdo realmente ajudou!
fonte
As respostas aqui são todas antigas ... A partir de 2017, a melhor resposta é:
fonte
Eu não estava usando o MySQL, mas importando alguns dados de um servidor ativo para o sqlite. Limpar os
contenttypes
dados do aplicativo antes de executarloaddata
o truque:E depois
fonte
Resolvi esse problema em meus casos de teste redefinindo o aplicativo contenttypes do teste de unidade antes de carregar meu arquivo de despejo. Carl sugeriu isso já usando o
manage.py
comando e eu faço a mesma coisa apenas usando ocall_command
método:Meu
full_test_data.json
fixture contém o dump do app contenttypes que corresponde ao resto dos dados de teste. Ao redefinir o aplicativo antes de carregar, evita a duplicação da chaveIntegrityError
.fonte
Isso funciona para mim. Aqui estou excluindo tudo dos modelos reais.
fonte
Você precisa usar chaves naturais para representar qualquer chave estrangeira e relacionamentos muitos para muitos. Além disso, pode ser uma boa ideia excluir a
session
tabela nosessions
aplicativo e alogentry
tabela noadmin
aplicativo.Django 1.7+
Django <1.7
De acordo com a documentação do Django ,
--natural
está obsoleto na versão 1.7, portanto, a opção--natural-foreign
deve ser usada em seu lugar.Você também pode omitir a chave primária nos dados serializados deste objeto, pois ela pode ser calculada durante a desserialização, passando o
--natural-primary
sinalizador.fonte
vai mudar
para
E a fixação funciona por
TestCase
agorafonte
Django 2.2.5
isso me ajudou
fonte
Vou dar outra resposta possível que acabei de descobrir. Talvez ajude o OP, talvez ajude outra pessoa.
Eu tenho uma tabela de relacionamento muitos para muitos. Ele possui uma chave primária e as duas chaves estrangeiras para as outras tabelas. Eu descobri que se eu tiver uma entrada no aparelho cujas duas chaves estrangeiras são iguais a outra entrada já na tabela com um pk diferente , ele irá falhar. As tabelas de relacionamento M2M têm um "conjunto único" para as duas chaves estrangeiras.
Então, se é um relacionamento M2M que está rompendo, olhe as chaves estrangeiras que está adicionando, olhe seu banco de dados para ver se aquele par de FKs já está listado em um PK diferente.
fonte
É muito, muito chato .. Eu sou mordido por isso toda vez.
Tentei despejar dados com --exclude contenttypes e --natural, sempre tive problemas ..
O que funciona melhor para mim é simplesmente fazer um
truncate table django_content_type;
após o syncdb e ENTÃO carregar os dados.É claro que, para o carregamento automático de initial_data.json, você é fallball.
fonte
Eu havia encontrado um erro semelhante algumas vezes atrás. Acontece que eu estava tentando carregar as luminárias antes de criar as tabelas necessárias. Então eu fiz:
e funcionou perfeitamente
fonte
No meu caso, eu tinha despejado os dados de
auth
(./manage.py dumpddata auth > fixtures/auth.json
) para usar o fixture para fins de teste.O desenvolvimento continuou e eu removi a maioria dos modelos que tinha definido
models.py
e foi aí que comecei a ver esse problema chato.Minha solução foi regenerar o dispositivo auth.json novamente. Este tinha removido muitas entradas
auth.permission
relacionadas aos modelos antigos que eu tinha.fonte
Eu tentei todos os métodos de cima, nada funcionou para mim. Tenho que excluir o modelo de autenticação completo e funciona bem.
fonte