2010-05-21 7 views
0

J'ai 2 tables, simpleDB_all et simpleDB_some. La table "all" a une entrée pour chaque élément que je veux, tandis que la table "some" a des entrées seulement pour certains éléments qui ont besoin d'informations supplémentaires. Les modèles de Django pour ceux-ci sont:Left Rejoindre un champ OneToOne dans Django

class all(models.Model): 
    name = models.CharField(max_length=40) 
    important_info = models.CharField(max_length=40) 

class some(models.Model): 
    all_key = models.OneToOneField(all) 
    extra_info = models.CharField(max_length=40) 

J'aimerais créer une vue qui montre tous les éléments de « tout » avec les informations supplémentaires si elle existe dans « certains ». Depuis que je suis sur un 1-1 terrain, je peux le faire avec presque succès:

allitems = all.objects.all() 
for item in allitems: 
    print item.name, item.important_info, item.some.extra_info 

mais quand je reçois à l'élément qui ne dispose pas d'entrée correspondante dans le tableau « certains » I obtenez une exception DoesNotExist.

Idéalement, je ferais cette boucle à l'intérieur d'un modèle, il est donc impossible de l'entourer d'une clause «essayer». Des pensées?

je peux obtenir l'effet désiré directement dans SQL en utilisant une requête comme ceci:

SELECT all.name, all.important_info, some.extra_info 
    FROM all LEFT JOIN some ON all.id = some.all_key_id; 

Mais je préfère ne pas utiliser SQL brut.

Répondre

2

Vous ne recevrez pas d'exception DoesNotExist dans le modèle - ils sont cachés, par leur conception, par le système de gabarit.

Le SQL que vous donnez est ce qui est généré, plus ou moins, lorsque vous utilisez select_related sur votre requête (si vous utilisez Django 1.2 ou une caisse plus récente que r12307, de Février):

allitems = all.objects.select_related('some') 
+0

Cela peut fonctionner. Merci pour la suggestion ... quand j'arrive à nouveau à cette partie de l'application et que je vérifie silencieusement la forme "fait la bonne chose" je reviendrai et marquerai ceci comme réponse. Merci. – jamida

Questions connexes