2013-08-21 24 views
20

Tôi đang sử dụng get_object_or_404 để tìm danh sách giá trị từ cơ sở dữ liệu của mình. Tôi đang cố gắng lọc hàm get_object_or_404 cho biến trạng thái để chỉ lấy các giá trị được liên kết với disease_id. Đoạn code dưới đây không hoạt động (nó lấy tất cả các giá trị trong bảng Nhà nước. Bất cứ ý tưởng?nhận giá trị cơ sở dữ liệu bằng cách sử dụng 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") 

Trả lời

23

get_object_or_404 sẽ chỉ trả về một đối tượng. Bạn cần get_list_or_404 vì có thể có nhiều trạng thái cho một bệnh:

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

get_list_or_404 đã hoạt động! Cảm ơn – nlr25

2

Tôi ngạc nhiên đó không phải là 404'ing, thực sự Hãy thử điều này:

state = get_object_or_404(State, relevantdisease_id=disease_id) 

Hoặc, nếu bạn thích, điều này:

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

Điểm có ích là lĩnh vực relevantdisease hy vọng bộ lọc để sử dụng mô hình thực tế Disease, không phải là PK. Bạn có thể sử dụng PK nếu bạn lọc trên trường ID ngầm định, như trong ví dụ đầu tiên của tôi hoặc tìm nạp đối tượng Bệnh và lọc bằng cách sử dụng nó. Sau này sẽ không hiệu quả nếu bạn không cần trường hợp bệnh anyway, nhưng ví dụ của bạn cho thấy bạn lấy nó bất kể do đó lấy nó đầu tiên sẽ không chi phí cho bạn bất kỳ hiệu suất.

2

Tôi nghĩ bạn đang thiếu thứ gì đó với các kiểu máy của mình.

Bạn có ForeighKey() với Disease trong mô hình State. Điều đó có nghĩa là có nhiềuState s cho mộtDisease.

Vì vậy, khi bạn thực hiện get_object_or_404(State, relevantdisease_id=disease_id) bạn sẽ nhận được tất cả State đối tượng cho số disease_id đó.

Bạn có thể muốn sử dụng get_list_or_404() và làm việc với danh sách các đối tượng State hoặc chọn một đối tượng với bất kỳ tiêu chí nào bạn muốn.

Các vấn đề liên quan