diff --git a/src/postgrest/src/postgrest/base_request_builder.py b/src/postgrest/src/postgrest/base_request_builder.py index fcbad9ad..2f3d272f 100644 --- a/src/postgrest/src/postgrest/base_request_builder.py +++ b/src/postgrest/src/postgrest/base_request_builder.py @@ -433,7 +433,11 @@ def or_(self: Self, filters: str, reference_table: Optional[str] = None) -> Self filters: The filters to use, following PostgREST syntax reference_table: Set this to filter on referenced tables instead of the parent table """ - key = f"{sanitize_param(reference_table)}.or" if reference_table else "or" + if self.negate_next: + self.negate_next = False + key = f"{sanitize_param(reference_table)}.not.or" if reference_table else "not.or" + else: + key = f"{sanitize_param(reference_table)}.or" if reference_table else "or" self.request.params = self.request.params.add(key, f"({filters})") return self diff --git a/src/postgrest/tests/_async/test_filter_request_builder.py b/src/postgrest/tests/_async/test_filter_request_builder.py index f6e6fecd..b9bf4288 100644 --- a/src/postgrest/tests/_async/test_filter_request_builder.py +++ b/src/postgrest/tests/_async/test_filter_request_builder.py @@ -294,6 +294,16 @@ def test_or_(filter_request_builder): assert str(builder.request.params) == "or=%28x.eq.1%29" +def test_not_or_(filter_request_builder): + builder = filter_request_builder.not_.or_("x.eq.1") + + assert str(builder.request.params) == "not.or=%28x.eq.1%29" + assert not builder.negate_next + + foreign = filter_request_builder.not_.or_("x.eq.1", reference_table="cities") + assert str(foreign.request.params) == "not.or=%28x.eq.1%29&cities.not.or=%28x.eq.1%29" + + def test_or_in_contain(filter_request_builder): builder = filter_request_builder.or_("id.in.(5,6,7), arraycol.cs.{'a','b'}") diff --git a/src/postgrest/tests/_sync/test_filter_request_builder.py b/src/postgrest/tests/_sync/test_filter_request_builder.py index 11cc9959..b45ce555 100644 --- a/src/postgrest/tests/_sync/test_filter_request_builder.py +++ b/src/postgrest/tests/_sync/test_filter_request_builder.py @@ -294,6 +294,16 @@ def test_or_(filter_request_builder): assert str(builder.request.params) == "or=%28x.eq.1%29" +def test_not_or_(filter_request_builder): + builder = filter_request_builder.not_.or_("x.eq.1") + + assert str(builder.request.params) == "not.or=%28x.eq.1%29" + assert not builder.negate_next + + foreign = filter_request_builder.not_.or_("x.eq.1", reference_table="cities") + assert str(foreign.request.params) == "not.or=%28x.eq.1%29&cities.not.or=%28x.eq.1%29" + + def test_or_in_contain(filter_request_builder): builder = filter_request_builder.or_("id.in.(5,6,7), arraycol.cs.{'a','b'}")