Получение значений базы данных с помощью get_object_or_404
Я использую get_object_or_404
, чтобы попытаться получить список значений из моей базы данных. Я пытаюсь отфильтровать функцию get_object_or_404
для переменной состояния, чтобы захватить только значения, связанные с disease_id
. Код ниже не работает (он захватывает все значения в таблице состояний. Любые идеи?
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")
Ответы
Ответ 1
get_object_or_404
возвращает только один объект. Вам нужно get_list_or_404
, поскольку для одного заболевания может быть несколько состояний:
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)
Ответ 2
Я удивлен, что не на самом деле. Попробуйте следующее:
state = get_object_or_404(State, relevantdisease_id=disease_id)
Или, если хотите, это:
disease = get_object_or_404(Disease, pk=disease_id)
state = get_object_or_404(State, relevantdisease=disease)
Дело в том, что поле relevantdisease
ожидает, что фильтры будут использовать фактическую модель Disease
, а не PK. Вы можете использовать PK, если вы фильтруете неявное поле идентификатора, как в моем первом примере, или выберите объект Disease и с помощью фильтра. Последний был бы неэффективен, если бы вам не понадобился экземпляр Disease в любом случае, но ваш пример показывает, что вы его извлекаете, несмотря на то, что его получение сначала не будет стоить вам никакой производительности.
Ответ 3
Я думаю, что вы упустили что-то с вашими моделями.
У вас ForeighKey()
с Disease
в модели State
. Это означает, что существует много State
для одного Disease
.
Итак, когда вы делаете get_object_or_404(State, relevantdisease_id=disease_id)
, вы получите все State
объекты для этого disease_id
.
Возможно, вы захотите использовать get_list_or_404()
и работать либо с списком объектов State
, либо выбрать один из них с любыми критериями, которые вы хотите.