61 votes

Puis-je utiliser une vue de base de données comme un modèle dans Django?

je voudrais utiliser un avis que j'ai créé dans ma base de données comme source de mon django-vue.

Est-ce possible, sans l'aide de sql personnalisée?

****13/02/09 mise à JOUR*********

Comme beaucoup de réponses suggèrent, vous pouvez simplement faire votre propre point de vue dans la base de données et ensuite de l'utiliser à l'intérieur de l'API par le définir dans le models.py.

un avertissement cependant:

  • manage.py syncdb ne fonctionnera plus
  • le point de vue besoin de la même chose au début de son nom, comme tous les autres modèles(tables) e.g si votre application est appelée "chose" alors, votre avis aura besoin d'être appelée thing_$viewname

93voto

drdaeman Points 3312

Juste une mise à jour pour ceux qui rencontrerez cette question (à partir de Google ou tout autre chose)...

Actuellement Django a un simple "bonne façon" de définir un modèle sans la gestion des tables de base de données:

Des Options.géré

Par défaut, True, sens de Django va créer les tables de base de données en syncdb et les supprimer dans le cadre d'un reset gestion de la commande. C'est, Django gère les tables de la base' cycles de vie.

Si False, pas de table de base de données la création ou la suppression opérations seront effectuées pour ce modèle. Ceci est utile si le modèle représente une table ou une vue de base de données qui a été créé par d'autres moyens. C'est la seule différence lors de l' managed est False. Tous les autres aspects du modèle de la manipulation est exactement la même que la normale.

33voto

Ferdinand Beyer Points 27723

Aussi loin que je peux voir, vous pouvez facilement définir un Modèle de classe pour l'afficher et l'utiliser comme vos autres points de vue. Je viens de tester à l'aide d'un Sqlite base de app et il semble bien fonctionner. Juste assurez-vous d'ajouter un champ de clé primaire si votre vue de la "clé primaire" de la colonne n'est pas nommé 'id' et spécifiez le point de vue de son nom dans la Méta options si votre vue n'est pas appelé "app_classname'.

Le seul problème est que le "syncdb" commande déclenche une exception puisque Django va tenter de créer la table. Vous pouvez éviter cela en définissant la vue des modèles dans un autre fichier Python, différente de celle que models.py. De cette façon, Django va pas les voir lors de l'introspection models.py afin de déterminer les modèles pour créer de l'application et donc de ne pas tenter de créer la table.

3voto

Joe Holloway Points 11122

Nous avons fait ce assez largement dans nos applications avec MySQL à travailler autour de la base de données unique limitation de Django. Notre demande a un couple de bases de données qui vivent dans une seule instance MySQL. Nous pouvons réaliser de la croix-modèle de base de données se joint à cette façon aussi longtemps que nous avons vues créées pour chaque table, dans le "courant" de la base de données.

Aussi loin que les insertions, mises à jour en vue d'aller à notre cas d'utilisation, d'un point de vue est fondamentalement une "select * from [db.table];". En d'autres termes, nous n'en fais pas des jointures complexes ou de filtrage afin d'insérer ou de mises à jour de déclenchement de save() fonctionnent tout aussi bien. Si votre cas nécessite des jointures complexes ou importantes de filtrage, je soupçonne que vous n'aurez pas de problèmes pour les scénarios de lecture seule, mais peut insérer/mettre à jour des questions. Je pense qu'il y a certaines contraintes sous-jacentes dans MySQL qui vous empêchent de mise à jour dans les vues que la croix tables, sont des filtres complexes, etc.

De toute façon, votre kilométrage peut varier si vous êtes en utilisant un SGBD autre que MySQL, mais Django n'a vraiment pas de soins si son assis sur le dessus d'une table physique ou de la vue. Ça va être le SGBDR qui détermine si elle fonctionne en fait comme vous l'attendez. Comme un précédent intervenant a noté, vous serez probablement jeter des syncdb par la fenêtre, même si nous avons travaillé avec succès autour d'elle avec un post-syncdb signal que les gouttes de la table physique créé par Django et dirige notre "créer une vue... de la commande". Cependant, le post-syncdb signal est un peu ésotérique dans la façon dont il se déclenche, donc caveat emptor.

EDIT: bien sûr, en "post-syncdb signal", je veux dire "post-syncdb listener"

3voto

Josep Bibiloni Points 133

De Django Documentation Officielle, vous pouvez appeler les afficher comme ceci:

#import library
from django.db import connection

#Create the cursor
cursor = connection.cursor()

#Write the SQL code
sql_string = 'SELECT * FROM myview'

#Execute the SQL
cursor.execute(sql_string)
result = cursor.fetchall()

J'espère que ça aide ;-)

0voto

Sam Corder Points 3196

Est-il possible de faire ce que vous voulez à travers le modèle de l'héritage?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X