2014-07-21 16 views
6

tôi có các mô hình sau đây trong ứng dụng django:khuôn khổ Django REST của phím nước ngoài và lọc

models.py:

class Make(BaseModel): 
    slug = models.CharField(max_length=32) #alfa-romeo 
    name = models.CharField(max_length=32) #Alfa Romeo 

    def __unicode__(self): 
     return self.name 

class Model(BaseModel): 
    make = models.ForeignKey(Make) #Alfa Romeo 
    name = models.CharField(max_length=64) # line[2] 
    engine_capacity = models.IntegerField() 
    trim = models.CharField(max_length=128) # line[4] 

serializers.py:

from .models import Make,Model 
from rest_framework import serializers 


class MakeSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Make 
     fields = ('url', 'slug', 'name') 


class ModelSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Model 
     fields = ('url', 'make', 'name', 'trim', 'engine_capacity') 

và cũng views.py:

from rest_framework import viewsets 
from rest_framework import filters 
from rest_framework import generics 

from .models import Make, Model 
from .serializers import MakeSerializer, ModelSerializer 


class MakeViewSet(viewsets.ModelViewSet): 
    queryset = Make.objects.all() 
    serializer_class = MakeSerializer 
    filter_backends = (filters.DjangoFilterBackend,) 

class ModelViewSet(viewsets.ModelViewSet): 
    make = MakeSerializer 
    queryset = Model.objects.all() 
    serializer_class = ModelSerializer 
    filter_backends = (filters.DjangoFilterBackend,) 

Điều tôi cần phải làm, tôi muốn tìm nạp tất cả các Mô hình được sản xuất theo chế độ cụ thể. Làm thế nào tôi có thể nhận được tất cả các mô hình có khóa ngoài cụ thể bằng cách sử dụng thông số truy vấn? Và câu hỏi thứ 2 của tôi - tôi có thể lọc kết quả bằng cách sử dụng queryparams để lấy mô hình với engine_capacity cụ thể không?

Một bình luận: Nó sẽ là hoàn hảo, nếu tôi có thể để truy vấn kết quả sử dụng một cái gì đó như thế này trong url: /api/models/?make=ford nơi làmslug trường trong Make mô hình

Trả lời

7

urls.py

url('^model/by/(?P<make>\w+)/$', ModelByMakerList.as_view()), 

views.py

class ModelByMakerList(generics.ListAPIView): 
    serializer_class = ModelSerializer 

    def get_queryset(self): 
     """ 
     This view should return a list of all models by 
     the maker passed in the URL 
     """ 
     maker = self.kwargs['make'] 
     return Model.objects.filter(make=maker) 

Để biết thêm thông tin checkout the docs.

Bạn cũng có thể sử dụng tính năng lọc với QUERY_PARAMS, nhưng IMHO có vẻ tốt hơn.

1

một cái gì đó Những gì bạn cần phải làm theo quan điểm của bạn là như thế này: Nó được gọi là "tra cứu mà span mối quan hệ"

queryset = Model.objects.filter(make__name__exact='Alfa Romeo') 

lọc các mô hình với công suất động cơ cụ thể là tương tự

queryset = Model.objects.filter(engine_capacity__exact=5) 

nếu bạn muốn cả hai bộ lọc kết hợp, bạn có thể chuỗi chúng:

queryset = Model.objects.filter(make__name__exact='Alfa Romeo').filter(engine_capacity__exact=5) 

nhiều ví dụ có thể được tìm thấy ở đây django query making

+2

Tôi biết cách truy vấn các mô hình Django chuẩn, tôi cần phải làm tương tự với Django Rest Framework – dease

6

Bạn có thể chỉ định filter_fields = ('make__slug',) trong chế độ xem của bạn. Đừng quên bao gồm cả filter_backends = (DjangoFilterBackend,). Ngoài ra, bạn sẽ cần phải thêm phụ thuộc django-filter.

class ModelViewSet(viewsets.ModelViewSet): 
    queryset = Model.objects.all() 
    serializer_class = ModelSerializer 
    filter_backends = (filters.DjangoFilterBackend,) 
    filter_fields = ('make__slug',) 

Sau đó, bạn truy vấn như /api/models/?make__slug=ford. Lưu ý biểu tượng dấu gạch dưới kép.

Docs.

Nếu bạn không thích make__slug tranh cãi từ khóa trong URL, sau đó bạn có thể tạo ra một lớp lọc:

import django_filters 

from myapp.models import Make 


class ModelFilter(django_filters.FilterSet): 
    make = django_filters.ModelChoiceFilter(name="make__slug", 
              queryset=Make.objects.all()) 

    class Meta: 
     model = Model 
     fields = ('make',) 

và sau đó

class ModelViewSet(viewsets.ModelViewSet): 
    make = MakeSerializer 
    queryset = Model.objects.all() 
    serializer_class = ModelSerializer 
    filter_backends = (filters.DjangoFilterBackend,) 
    filter_class = ModelFilter 

/api/models/?make=ford nên làm việc.

+1

Điều này nghĩ rằng đây là câu trả lời hay nhất: P – hugoruscitti

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