Niestety, nie ma.
Problem polega na tym, że klasa ModelResource Tastypie używa metody filter() tylko w QuerySet, tzn. Nie używa metody exclude(), która powinna być używana w filtrach ujemnych. Nie ma szukania w filtrze(), które oznaczałoby negację. Poprawne wyszukiwań są (po tym 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
Jednak to nie powinno być tak trudne do wdrożenia wsparcia dla czegoś podobnego „__not_eq”. Wszystko, co musisz zrobić, to zmodyfikować metodę apply_filters() i oddzielić filtry od "__not_eq" od reszty. Następnie powinieneś przekazać pierwszą grupę do exclude(), a resztę do filter().
Coś jak:
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)
zamiast domyślnego:
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)
powinno pozwolić na następującej składni:
someapi.com/resource/pk/?field__not_eq=value
ja jej nie testowane. To może być napisany prawdopodobnie w bardziej elegancki sposób też, ale powinno być ci :)
W niektórych przypadkach masz możliwość, aby zastąpić go z niektórych filtrów tak:? 'Field__not = null' można zastąpić' field__isnull = FALSE „_not większa than_” można zastąpić? po prostu '? field__lte = x' (czyli z" _less than equal_ "). Pamiętaj też, że Django może w jakiś sposób pozwolić ci przekazać 'field! = Value' jako argument, ale spowoduje to, że wartość boolowska zostanie przekazana dalej (lub' NameError' jeśli 'field' nie jest zdefiniowaną zmienną). Czy też się mylę i Django wykonuje przeciążenie operatora np. web2py działa w przypadku konstruktora zapytań? – Tadeck