Pergunta

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

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

Caught uma exceção durante o processamento: (1054, "coluna desconhecida 'read_only_view id ' em 'lista de campo'")

Existe 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. O mysql mostra navegador colunas lá, mas nenhuma chave primária.

Foi útil?

Solução

Quando você diz 'eu não tenho controle sobre a visão que eu estou acessando com Django. O mysql mostra navegador 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 colunas de mudança?

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 pode muito bem fedor.

Não importa para você embora. Tudo que você precisa é uma coluna que seja garantida a ser exclusivo para cada linha. Conjunto 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.

Outras dicas

Eu tenho esse problema o tempo todo. Eu tenho uma visão que eu não podem ou não querem mudança, 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 tag-lo como a 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 muito bem para mim. Por favor commment se existem problemas com esta técnica que eu estou com vista.

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

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

Deve ter havido um campo id gerada automaticamente quando você executou syncdb (se não houver nenhuma chave primária definida no seu modelo, então o Django irá inserir um AutoField para você).

Isto significa erro que Django está pedindo seu banco de dados para o campo id, mas não existe nenhum. você pode executar django manage.py dbshell e depois DESCRIBE read_only_view; e postar o resultado? Isto irá mostrar todas as colunas que estão no banco de dados.

Como alternativa, você pode incluir a definição do modelo que você excluídos? (E confirmar que você não tenha alterado a definição do modelo desde que você correu syncdb?)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top