2013-08-21 5 views
20

J'utilise get_object_or_404 pour essayer d'obtenir une liste de valeurs de ma base de données. J'essaie de filtrer la fonction get_object_or_404 pour que la variable d'état saisisse uniquement les valeurs associées au disease_id. Le code ne fonctionne pas au-dessous (il saisit toutes les valeurs dans le tableau de l'Etat. Toutes les idées?Obtenir des valeurs de base de données en utilisant get_object_or_404

views.py

def option(request, disease_id, state_id): 

    state = get_object_or_404(State, relevantdisease=disease_id) 
    disease = get_object_or_404(Disease, pk=disease_id) 

    context = {'state': state, 'disease':disease } 
    return render(request, "option.html", context) 

models.py

class State(models.Model): 
    state = models.CharField(max_length=300, verbose_name='state') 
    relevantdisease = models.ForeignKey(Disease, verbose_name="disease") 

Répondre

23

get_object_or_404 ne retournera qu'un seul objet. Vous avez besoin de get_list_or_404 car il peut y avoir plusieurs états pour une maladie:

from django.shortcuts import get_list_or_404, get_object_or_404 

def option(request, disease_id, state_id): 

    state = get_list_or_404(State, relevantdisease__pk=disease_id) 
    disease = get_object_or_404(Disease, pk=disease_id) 

    context = {'state': state, 'disease':disease } 
    return render(request, "option.html", context) 
+1

le get_list_or_404 a fonctionné! Merci – nlr25

2

Je suis Je suis surpris que ce n'est pas 404, en fait. Essayez ceci:

state = get_object_or_404(State, relevantdisease_id=disease_id) 

Ou, si vous préférez, ceci:

disease = get_object_or_404(Disease, pk=disease_id) 
state = get_object_or_404(State, relevantdisease=disease) 

Le point est que le champ relevantdisease attend les filtres à utiliser le modèle Disease réel, pas le PK. Vous pouvez utiliser le PK si vous filtrez sur le champ ID implicite, comme dans mon premier exemple, ou récupérez un objet Disease et filtrez en utilisant cela. Ce dernier serait inefficace si vous n'aviez pas besoin de l'instance de Maladie de toute façon, mais votre exemple montre que vous le récupérez indépendamment du fait que le récupérer d'abord ne vous coûtera aucune performance.

2

Je pense qu'il vous manque quelque chose avec vos modèles.

Vous avez ForeighKey() avec Disease dans le modèle State. Qu'est-ce que cela signifie, il y a beaucoupState s pour unDisease. Donc, quand vous faites get_object_or_404(State, relevantdisease_id=disease_id), vous obtiendrez tous les objets State pour ce disease_id.

Vous pouvez utiliser get_list_or_404() et travailler avec la liste des objets State ou en choisir un avec les critères que vous voulez.

Questions connexes