lookups.py 1.0 KB

1234567891011121314151617181920212223242526272829303132333435
  1. from django.db.models import CharField, Lookup
  2. from .fields import CachedValueField
  3. class Empty(Lookup):
  4. """
  5. Filter on whether a string is empty.
  6. """
  7. lookup_name = 'empty'
  8. prepare_rhs = False
  9. def as_sql(self, compiler, connection):
  10. sql, params = compiler.compile(self.lhs)
  11. if self.rhs:
  12. return f"CAST(LENGTH({sql}) AS BOOLEAN) IS NOT TRUE", params
  13. else:
  14. return f"CAST(LENGTH({sql}) AS BOOLEAN) IS TRUE", params
  15. class NetContainsOrEquals(Lookup):
  16. """
  17. This lookup has the same functionality as the one from the ipam app except lhs is cast to inet
  18. """
  19. lookup_name = 'net_contains_or_equals'
  20. def as_sql(self, qn, connection):
  21. lhs, lhs_params = self.process_lhs(qn, connection)
  22. rhs, rhs_params = self.process_rhs(qn, connection)
  23. params = lhs_params + rhs_params
  24. return 'CAST(%s AS INET) >>= %s' % (lhs, rhs), params
  25. CharField.register_lookup(Empty)
  26. CachedValueField.register_lookup(NetContainsOrEquals)