2013-08-21 26 views
20

używam get_object_or_404 próbować uzyskać listę wartości z mojej bazy danych. Próbuję filtrować funkcję get_object_or_404 dla zmiennej stanu, aby pobrać tylko te wartości, które są powiązane z disease_id. Poniższy kod nie działa (łapie wszystkie wartości w tabeli państwa. Jakieś pomysły?uzyskiwanie wartości bazy danych przy użyciu 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") 

Odpowiedz

23

get_object_or_404 zwróci jedynie jeden obiekt. Potrzebujesz get_list_or_404, ponieważ może być wiele stanów dla jednej choroby:

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

the get_list_or_404 zadziałał! Dzięki – nlr25

2

jestem Zaskoczony, że to nie jest 404. Spróbuj:

state = get_object_or_404(State, relevantdisease_id=disease_id) 

Lub, jeśli wolisz, w tym:

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

Chodzi o to, że pole relevantdisease spodziewa Filtry w użyciu rzeczywistej Disease modelu, a nie PK. Możesz użyć PK, jeśli filtrujesz na niejawnym polu identyfikacyjnym, tak jak w moim pierwszym przykładzie, lub pobierasz obiekt choroby i filtrujesz go za pomocą tego. Ten ostatni byłby nieefektywny, gdyby i tak nie potrzebowałeś instancji Disease, ale twój przykład pokazuje, że możesz ją pobrać, ale pobieranie jej nie będzie kosztować żadnej wydajności.

2

Chyba brakuje coś ze swoich modeli.

Masz ForeighKey() z Disease w modelu State. Co to znaczy, że są wieleState s dla jedenDisease.

Po wykonaniu get_object_or_404(State, relevantdisease_id=disease_id) otrzymasz wszystkie obiekty State dla tego disease_id.

Możesz użyć get_list_or_404() i pracować z listą obiektów State lub wybrać jedną z dowolnymi kryteriami.

Powiązane problemy