2010-01-04 5 views
0

J'ai plusieurs modèles qui ont tous un FK pour le même modèle. Tout ce que je sais est le FK comment puis-je déterminer lequel des modèles a le FK attaché?Interroger plusieurs modèles avec une valeur

Ci-dessous un exemple pour clearify:

class ModelA(models.Model): 
     title = models.CharField("title", max_length=80) 

class ModelB(models.Model): 
     fk = models.ForeignKey(ModelA) 

class ModelC(models.Model): 
     fk = models.ForeignKey(ModelA) 

Comment puis-je comprendre sans l'aide d'un essai/sauf si chaque modèle B ou C a le FK? (Le FK ne peut être dans l'un d'entre eux, pour l'enregistrement dans ce cas, je n'ajouté deux modèles, mais dans l'application réelle du monde il y a plusieurs quantité possible x de modèles qui ont la FK à modela)

Répondre

0
if ModelB.objects.filter(fk=your_fk): 
    print "B" 
else: 
    print "C" 

si vous n'êtes pas sûr que ce fk est présent dans B ou C du tout, ajouter un autre contrôle:

if ModelB.objects.filter(fk=your_fk): 
    print "B" 
elif ModelC.objects.filter(fk=your_fk): 
    print "C" 
else: 
    print "none" 
+0

Mais je pense que c'est trop semblable à essayer/sauf que vous avez mentionné . Quel est le problème avec essayer/sauf? Vous souhaitez utiliser une requête de base de données unique pour vérifier les deux résultats? –

+0

laisse supposer que j'ai 20 modèles, je ne veux pas essayer/sauf tous. Je me demandais s'il y avait un moyen d'interroger pour vérifier tous les modèles pour un résultat. Sinon, je dois faire un modèle intermédiaire. – swoei

+0

Quelle est votre intention - l'optimisation du temps (pour faire une demande complexe au lieu de 20 simple) ou juste une commodité syntaxique? –

0

Si comme vous avez dit que vous avez de nombreux modèles avec ForeignKeys à ModelA peut-être vous devriez envisager d'avoir un champ ModelA qui met en cache cette information? Il pourrait être mis à jour par save() méthode de ModelB/C/.. ou par une procédure stockée de base de données.

+0

Que diriez-vous de cette réponse? –

0

Si vous êtes après le sucre syntaxique et réduction du nombre de requêtes, essayez ceci:

a=ModelA.objects.annotate(nb=Count('modelb'), nc=Count('modelc')).get(pd=your_fk) 
if a.nb: 
    return 'B' 
elif a.nc: 
    return 'C' 
else: 
    return 'A' 

(django> = V1.1)

Questions connexes