38

我正在get_object_or_404尝试从我的数据库中获取值列表。我正在尝试过滤get_object_or_404状态变量的函数以仅获取与disease_id. 下面的代码不起作用(它获取 State 表中的所有值。有什么想法吗?

视图.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)

模型.py

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

3 回答 3

62

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)
于 2013-08-21T06:31:13.460 回答
4

实际上,我很惊讶这不是 404'ing。尝试这个:

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。如果您在隐式 ID 字段上进行过滤,您可以使用 PK,就像我的第一个示例一样,或者获取一个疾病对象并使用它进行过滤。如果您无论如何都不需要 Disease 实例,后者的效率会很低,但是您的示例显示您无论如何都要检索它,因此首先获取它不会花费您任何性能。

于 2013-08-21T05:43:31.283 回答
3

我认为您的模型缺少一些东西。

ForeighKey()有模型Disease这意味着一个State多个 States 。 Disease

因此,当您这样做时,get_object_or_404(State, relevantdisease_id=disease_id)您将获得所有State对象disease_id

您可能想要使用get_list_or_404()和处理State对象列表,或者根据您想要的任何标准选择一个。

于 2013-08-21T05:54:02.707 回答