Purtroppo non c'è.
Il problema è che la classe ModelResource di Tastypie utilizza solo il metodo filter() di QuerySet, ovvero non utilizza exclude() che dovrebbe essere utilizzata per i filtri negativi. Non esiste una ricerca sul campo filter() che significherebbe negazione. Le ricerche sono validi (dopo questo SO post):
exact
iexact
contains
icontains
in
gt
gte
lt
lte
startswith
istartswith
endswith
iendswith
range
year
month
day
week_day
isnull
search
regex
iregex
Tuttavia non dovrebbe essere così difficile da attuare il supporto per qualcosa come "__not_eq". Tutto quello che devi fare è modificare il metodo apply_filters() e separare i filtri con "__not_eq" dal resto. Quindi devi passare il primo gruppo a exclude() e il resto a filter().
Qualcosa di simile:
def apply_filters(self, request, applicable_filters):
"""
An ORM-specific implementation of ``apply_filters``.
The default simply applies the ``applicable_filters`` as ``**kwargs``,
but should make it possible to do more advanced things.
"""
positive_filters = {}
negative_filters = {}
for lookup in applicable_filters.keys():
if lookup.endswith('__not_eq'):
negative_filters[ lookup ] = applicable_filters[ lookup ]
else:
positive_filters[ lookup ] = applicable_filters[ lookup ]
return self.get_object_list(request).filter(**positive_filters).exclude(**negative_filters)
al posto del default:
def apply_filters(self, request, applicable_filters):
"""
An ORM-specific implementation of ``apply_filters``.
The default simply applies the ``applicable_filters`` as ``**kwargs``,
but should make it possible to do more advanced things.
"""
return self.get_object_list(request).filter(**applicable_filters)
dovrebbe consentire la seguente sintassi:
someapi.com/resource/pk/?field__not_eq=value
non l'ho testato. Si potrebbe probabilmente essere scritto in modo più elegante troppo, ma dovrebbe farti andare :)
In alcuni casi si ha la possibilità di sostituirlo con alcuni filtri del genere: 'field__not = null' può essere sostituito con' field__isnull = false', "_non maggiore than_" può essere sostituito? semplicemente '? field__lte = x' (quindi con" _less than equal_ "). Inoltre, tieni presente che Django potrebbe in qualche modo consentire di passare 'field! = Value' come argomento, ma il valore booleano verrà passato ulteriormente (o' NameError' se 'field' non è una variabile definita). O mi sbaglio e Django esegue il sovraccarico dell'operatore come ad es. web2py fa in caso di query builder? – Tadeck