使用get_object_or_404获取数据库值

时间:2013-08-21 05:36:43

标签: django

我正在使用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")

3 个答案:

答案 0 :(得分:33)

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)

答案 1 :(得分:3)

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

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对象和过滤器。如果你不需要疾病实例,那么后者效率很低,但是你的例子显示你检索它,无论如何首先获取它不会花费你任何性能。

答案 2 :(得分:2)

我认为你的模特遗漏了一些东西。

ForeighKey()模型中Disease State State。这意味着一个 Disease许多 get_object_or_404(State, relevantdisease_id=disease_id)

因此,当您执行State时,您将获得disease_id的所有get_list_or_404()个对象。

您可能希望使用State并使用{{1}}个对象列表,或者选择一个符合您需要的对象。