2014-06-25 23 views
8

我想在我的REST API - see django docs on this篩選查詢參數。 然而,一個參數我想,以濾除只能通過模型​​@property在過濾器中使用自定義方法與Django的其餘框架

例如models.py:

class Listing(models.Model): 
    product = models.OneToOneField(Product, related_name='listing') 
    ... 
    @property 
    def category(self): 
     return self.product.assets[0].category.name 

這裏是設置在按照我的房屋API和django-filter docs

class ListingFilter(django_filters.FilterSet): 
     product = django_filters.CharFilter(name='product__name') 
     category = django_filters.CharFilter(name='category') #DOES NOT WORK!! 

     class Meta: 
      model = Listing 
      fields = ['product','category'] 

    class ListingList(generics.ListCreateAPIView): 
     queryset = Listing.objects.all() 
     serializer_class = ListingSerializer 
     filter_class = ListingFilter 

如何適當地過濾listing.category?它無法直接在列表模式中使用。

+0

對於這種情況,這個答案的另一個問題可能幫助:http://stackoverflow.com/questions/14258338/django-rest-framework-filtering/35506369#35506369 – iankit

回答

13

使用「動作」參數來指定一個自定義的方法 - see django-filter docs

首先定義過濾使用類別參數值的查詢集的方法:

def filter_category(queryset, value): 
     if not value: 
      return queryset 

     queryset = ...custom filtering on queryset using 'value'... 
     return queryset 

上市過濾器應該是這樣的:

class ListingFilter(django_filters.FilterSet): 
     ... 
     category = django_filters.CharFilter(action=filter_category) 
     ... 
+4

只是一個快速的說明,Django的過濾器'行動'已被'方法'取代。 http://django-filter.readthedocs.io/en/latest/migration.html –

-1

對於數據庫速度的緣故,你應該只類別添加到您的房源模型

class Listing(models.Model): 
    product = models.OneToOneField(Product, related_name='listing') 
    category = models.ForeignKey(Category) 

然後用post_save signal保持田間更新

from django.dispatch import receiver 
from django.db.models.signals import post_save 

@receiver(post_save, sender=Product) 
def updateCategory(sender, instance, created, update_fields, **kwargs): 
    product = instance 
    product.listing.category = product.assets[0].category.name 
    product.listing.save() 

然後通過它的名稱進行篩選,就像任何其他領域:

class ListingFilter(django_filters.FilterSet): 
    ... 
    category = django_filters.CharFilter(name='category__name') 
    ... 
相關問題