2016-01-08 3 views
0
model.py 
class Device(models.Model): 
    uuid = models.CharField(max_length=100) 
    major = models.CharField(max_length=10) 
    minor = models.CharField(max_length=10) 

resource.py 
class DeviceResourceV3(ModelResource): 
    '''Fetch device details''' 
    class Meta: 
     queryset = Device.objects.all() 
     resource_name = 'device' 
     always_return_data = True 
     filtering = { 
      'uuid': ['exact', 'in'], 
      'id': ['exact'] 
    } 

Запрошенного API вызовы:Tastypie: Advance фильтр со сложным запросом

/api/device?uuidmm__in=XXXXXX,YYYYY 

Теперь в соответствии с требованием, мы должны создать фильтр, который приведет все устройства, для которых (UUID + главного + минора) в [XXXXXX, YYYYY]

Я пошел, хотя авансовые фильтры, упомянутые в

http://django-tastypie.readthedocs.org/en/latest/resources.html и
Django Tastypie Advanced Filtering: How to do complex lookups with Q objects

, но этот служебный прецедент становится слишком сложным. Кто-нибудь может предложить подходящие методы build_filters и apply_filters для этого запроса или любой другой простой подход для этого.

ответ

0

Я хотел бы попробовать сделать использование аннотаций:

class DeviceResourceV3(ModelResource): 
    uuidmm = fields.CharField(max_length=120) 


    class Meta: 
     queryset = Device.objects.all().annotate(uuidmm=(Concat('uuid', 'major', 'minor'))), 
     resource_name = 'device' 
     always_return_data = True 
     filtering = { 
      'uuid': ['exact', 'in'], 
      'id': ['exact'], 
      'uuidmm': ['exact', 'in'] 
    } 

я не могу проверить это прямо сейчас, если «__in» будет работать с этим подходом. Если нет, вы также можете перезаписать apply_filters:

def apply_filters(self, request, applicable_filters): 
    semi_filtered = super(DeviceResourceV3, self).apply_filters(request, applicable_filters) 

    uuidmms = request.GET.get('uuidmm__in', None) 

    if uuidmms: 
     # handle your filtering here, e.g. by combining all uuidmms to one string and check, and exclude the ones that are not in the combined string