Подтвердить что ты не робот

Получение значений базы данных с помощью 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")
4b9b3361

Ответ 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, либо выбрать один из них с любыми критериями, которые вы хотите.