Django: Consultando somente leitura ver com nenhuma chave primária

votos
21
class dbview(models.Model):
    # field definitions omitted for brevity
    class Meta:
        db_table = 'read_only_view'

def main(request):
    result = dbview.objects.all()

Pego uma exceção durante o processamento: (1054, coluna desconhecida 'read_only_view. Id ' em 'lista de campo')

nenhuma chave primária eu posso ver a vista. Existe uma solução?

Comentário:
Eu não tenho nenhum controle sobre a visão que eu estou acessando com Django. Navegador MySQL mostra colunas lá, mas nenhuma chave primária.

Publicado 03/03/2009 em 11:36
fonte usuário
Em outras línguas...                            


4 respostas

votos
17

Quando você diz 'Eu não tenho nenhum controle sobre a visão que eu estou acessando com Django. navegador MySQL mostra colunas lá, mas nenhuma chave primária.'

Eu suponho que você quer dizer que esta é uma mesa de legado e você não tem permissão para adicionar ou alterar colunas?

Se assim for e não há realmente uma chave primária (até mesmo uma corda ou coluna não-int *), em seguida, a tabela não foi configurado muito bem e desempenho poderia muito bem feder.

Não importa para você embora. Tudo que você precisa é uma coluna que seja garantida a ser exclusivo para cada linha. Definir que ser 'primary_key = True em seu modelo e Django será feliz.

  • Há uma outra possibilidade de que seria problemmatic. Se não houver nenhuma coluna que está garantido para ser único, em seguida, a mesa pode estar usando chaves primárias compostas. Isso é - é especificando que duas colunas em conjunto irá fornecer uma chave primária único. Esta é a modelagem relacional perfeitamente válido, mas infelizmente não suportado pelo Django. Nesse caso, você não pode fazer muito além de SQL cru a menos que você pode obter outra coluna acrescentou.
Respondeu 04/03/2009 em 11:50
fonte usuário

votos
13

Eu tenho esse problema o tempo todo. Eu tenho uma visão que eu não podem ou não querem mudar, mas eu quero ter uma página para exibir informações composite (talvez na seção admin). Eu só substituir o salvar e criar uma NotImplementedError:

    def save(self, **kwargs):
        raise NotImplementedError()

(Embora isso provavelmente não é necessária na maioria dos casos, mas isso me faz sentir um pouco melhor)

Eu também definir conseguiu Falso na classe Meta.

    class Meta:
       managed = False

Então eu só escolher qualquer campo e marcá-lo como chave primária. Não importa se é realmente único com você está apenas fazendo filtros para exibir informações em uma página, etc.

Parece funcionar bem para mim. Por favor commment se existem problemas com esta técnica que eu estou com vista.

Respondeu 21/07/2012 em 19:48
fonte usuário

votos
3

Se realmente existe nenhuma chave primária na vista, então não há nenhuma solução alternativa.

Django requer cada modelo para ter exatamente um campo primary_key=True.

Respondeu 03/03/2009 em 12:51
fonte usuário

votos
1

Não deve ter sido um auto-gerada idcampo quando executou syncdb(se não houver nenhuma chave primária definida no seu modelo, então o Django irá inserir um AutoFieldpara você).

Este erro significa que o Django está pedindo seu banco de dados para o idcampo, mas não existe nenhum. Você pode executar django manage.py dbshelle, em seguida, DESCRIBE read_only_view;e postar o resultado? Isto irá mostrar todas as colunas que estão no banco de dados.

Alternativamente, você pode incluir a definição do modelo que você excluídos? (e confirmar que não alteraram a definição do modelo desde que você correu syncdb?)

Respondeu 03/03/2009 em 12:40
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more