2013-02-28 2 views
1

Je suis en utilisant l'héritage en django avec les classes suivantes:django objects.all queryset ne retourne pas tous les objets de base de données

class main_menu(node): 
    """ 
    main_menu(node) 

    Has no extra fields. All children of the root node must 
    be main_menu nodes 
    """ 
    # Required for tree hierarchy to work (db_column='path' for raw queries) 
    _path1 = models.CharField(db_column='path', max_length=Global.MAX_FILE_PATH_LENGTH, unique=True); 
    main_menu_blah = models.CharField(max_length=30, default=''); 

    def __unicode__(self): 
     return self.main_menu_blah; 

main_menu

class language(main_menu): 
    """ 
    language(main_menu) 

    Main menu used specifically for a main menu targetted 
    at a speaker of some language. 
    """ 
    # Required for tree hierarchy to work 
    _path2 = models.CharField(db_column='path', max_length=Global.MAX_FILE_PATH_LENGTH, unique=True); 
    language_blah = models.CharField(max_length=30, default=''); 

    def __unicode__(self): 
     return self.language_blah; 

langue

class language2(language): 
    _path3 = models.CharField(db_column='path', max_length=Global.MAX_FILE_PATH_LENGTH, unique=True); 
    language_blah2 = models.CharField(max_length=30, default=''); 

Maintenant, je peux insérer l'accès à tous ces modèles très bien aussi longtemps. Je peux aussi les obtenir en utilisant .objects.get (...).

Mais si je supprime une ligne d'une table de classe parente (comme la langue qui est un parent à langue2), alors je ne peux pas obtenir() la dernière ligne de la table de langue2. J'exécute: subNode = language2.objects.get (_path3 =);

je reçois toujours l'erreur suivante:

DoesNotExist

langue2 requête correspondante n'existe pas.

Et je l'ai regardé dans la base de données (SQLite) et je peux voir que la dernière inscription dans la colonne _path3.

De plus, je peux utiliser une requête brute (en utilisant connection.cursor()) et je peux obtenir la dernière ligne. Mais ce sont seulement les données brutes, et j'ai besoin d'un objet modèle. Oh et en utilisant .extra() n'a pas fonctionné non plus. Pourquoi ne puis-je pas obtenir la dernière rangée? (Jusqu'à ce que je redémarre le serveur)

Merci. Les différentes variables "_path *" sont nécessaires pour autre chose, donc une classe de base abstraite n'aidera pas dans mon cas, mais c'est un autre sujet. En ce qui concerne db_column = 'path', je le fais pour que les requêtes brutes soient plus rationalisées et j'ai essayé de supprimer cela (de sorte que la colonne soit "_path1", "_path2", etc), mais le problème persiste encore. La partie la plus confuse est qu'une requête brute fonctionne, et le redémarrage du serveur la corrige (jusqu'à ce qu'une nouvelle ligne soit insérée, alors cette dernière n'est pas vue).

EDIT2: Je découvert ce qui se passait. La chose importante que j'oubliais était comment chaque table était attachée ensemble.

Si j'ai une classe de base: classe A

Une sous-classe: classe B (A)

Une autre sous-classe: classe C (B)

Je tables liées comme si :

A -> B -> C

Disons que j'ai 2 lignes dans chaque table (chaque o ne représentant une instance de la classe):

ligne 1 A: Nom = "Gérald" -> B: Âge = "25" -> C: Sexe = "Homme" ligne 2 A: Nom = "Janet" -> B: Age = "24" -> C: Sexe = "Femme"

Si la ligne deux dans la table B est supprimée, il y a une rupture dans le lien qui pointe vers la table C. Donc, j'ai fondamentalement coupé de le torse de la classe. 1/3 des données est manquant. Et donc, Django le signale comme inexistant. Par conséquent, veillez à être prudent lors de la suppression manuelle des entrées. Vous ne devriez pas avoir ce problème avec django car il devrait garder une trace de tout cela pour vous.

Répondre

0

La première chose que je remarque est que vous avez deux modèles héritant d'autres classes et ajoutant leurs propres champs, mais ils utilisent le même db_column. Une manière plus propre d'y parvenir (si vous n'utilisez pas directement main_menu) est d'utiliser un Abstract Base Class.

En effet, votre modèle language2 a ces domaines:

_path1 = models.CharField(db_column='path', max_length=Global.MAX_FILE_PATH_LENGTH, unique=True) 
    _path2 = models.CharField(db_column='path', max_length=Global.MAX_FILE_PATH_LENGTH, unique=True) 
    _path3 = models.CharField(db_column='path', max_length=Global.MAX_FILE_PATH_LENGTH, unique=True) 
    main_menu_blah = models.CharField(max_length=30, default='') 
    language_blah = models.CharField(max_length=30, default='') 
    language_blah2 = models.CharField(max_length=30, default='') 

De plus, Python ne nécessite pas un point-virgule à la fin de chaque énoncé.

Questions connexes