2015-09-17 2 views
0

Я совершенно нового в Django и Django Api Rest FrameWorkДжанго апи остальное фильтр manytomany

Я пытаюсь разработать Апи с двумя моделями relationated с ManyToMany соотношением

models.py
class Category(models.Model): 
    name = models.CharField(max_length=100) 

class Apartment(models.Model): 
    id_2 = models.IntegerField(default= None) 
    neighborhood = models.CharField(max_length=100) 
    name = models.CharField(max_length=120) 
    district = models.CharField(max_length=120) 
    created = models.DateTimeField() 
    cats = models.ManyToManyField(Category) 
    address = models.CharField(max_length=200) 
    postal_code = models.IntegerField() 
    latitude = models.FloatField() 
    longitude = models.FloatField() 

serializers.py

class CategorySerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Category 
     fields = ('id', 'name') 

class AptSerializer(serializers.HyperlinkedModelSerializer): 

    cats = CategorySerializer(many=True, read_only=True) 

    class Meta: 
     model = Apartment 
     fields = ('id_2', 'neighborhood', 'name','district','created','cats','address','postal_code','latitude','longitude') 

view.py
class AptViewSet(viewsets.ModelViewSet): 
    """ 
    API endpoint that allows groups to be viewed or edited. 
    """ 
    queryset = Apartment.objects.all() 
    serializer_class = AptSerializer 
    filter_backends = (filters.DjangoFilterBackend,) 
    filter_fields = ('id_2', 'neighborhood', 'name', 'district','created','cats','address','postal_code','latitude','longitude') 

routers.py

router.register(r'apartments', views.AptViewSet) 

Как вы можете видеть, он реализует DjangoFilterBackend так что теперь я могу фильтровать с URLs типа

http://localhost:8000/apartments/?district=Eixample 

и я получаю эту

{ 
    "id_2": 1044121532, 
    "neighborhood": "la Nova Esquerra de l'Eixample", 
    "name": "Hotel Exe AB Viladomat", 
    "district": "Eixample", 
    "created": "2001-02-13T00:00:00Z", 
    "cats": [ 
     { 
      "id": 1073, 
      "name": "Allotjament" 
     }, 
     { 
      "id": 1075, 
      "name": "Hotels" 
     }, 
     { 
      "id": 1076, 
      "name": "3 estrelles" 
     } 
    ], 
    "address": "Viladomat 197", 
    "postal_code": 8015, 
    "latitude": 41.383665702777776, 
    "longitude": 2.151834694444444 
}, 

Я хотел бы t o сделать запрос на получение запроса, как

http://localhost:8000/apartments/?cats_name=Hotels 

Но это не сработает, любая идея, с которой будет дорога с этого момента? Написать пользовательский фильтр? написать еще один объект ViewSet для категории?

Спасибо

ответ

1

Корневой QuerySet, предоставленный менеджером, описывает все объекты в таблице базы данных. Обычно, однако, вам нужно выбрать только подмножество полного набора объектов.

Но вот ваш передаете параметры запроса и фильтровать по всей QuerySet

views.py

class AptViewSet(viewsets.ModelViewSet): 
    """ 
    API endpoint that allows groups to be viewed or edited. 
    """ 
    queryset = Apartment.objects.all() 
    serializer_class = AptSerializer 

    def get_queryset(self): 
     queryset = super(AptViewSet, self).get_queryset() 
     cats_name = self.request.query_params.get('cat_name', None) 
     if cats_name: 
      queryset = queryset.filter(cats__name=cats_name) 
     return queryset 

Если вы можете следить за этот пост для записи пользовательских фильтров How to Pass kwarg to Filter

+0

Спасибо @seenu s это сработало для меня Единственная проблема - это параметр в getqueryset, который должен быть (я) 'class AptViewSet (класс) viewets.ModelViewSet): "" " Конечная точка API, которая позволяет просматривать или редактировать группы. " "" queryset = Apartment.objects.все() serializer_class = AptSerializer Защиту get_queryset (Я): QuerySet = супер (AptViewSet, самость) .get_queryset() cats_name = self.request.query_params.get ('cat_name', None) если cats_name не None: queryset = queryset.filter (cats__name = cats_name) return queryset' – PereCullera

+0

Можете ли вы принять ответ, который он поможет другим? –

0

this Заканчивать ссылку на фильтрации параметров запроса.

Вы переопределите метод get_queryset в своем сериализаторе.

+0

Спасибо за ваш ответ, но это уже реализовано, поскольку я использую DjangoFilterBackend, поэтому URL-адреса типа http: // localhost: 8000/apartments /? district = Eixample работают, проблема в том, что я пытаюсь отфильтровать для поля Category ManyToMany в типе URL HTTP: // локальный: 8000/apartments /? Cats_name = Гостиницы – PereCullera

+0

Хмммм, вы можете изменить 'cats' на' cats__name' в списке фильтров? – Erik

+0

Я использую cats__name, так как я читал где-то двойное подчеркивание - это путь к связанным полям – PereCullera

Смежные вопросы