From ef61476037e29cd16b741dbff64c6d2f71581b85 Mon Sep 17 00:00:00 2001 From: Chris Muthig Date: Thu, 1 May 2025 14:50:01 -0600 Subject: [PATCH] Support negated filters on one-to-one and many-to-one Relationships --- relativity/fields.py | 4 ++-- tests/tests.py | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/relativity/fields.py b/relativity/fields.py index f527260..22d5567 100644 --- a/relativity/fields.py +++ b/relativity/fields.py @@ -405,12 +405,12 @@ def get_path_info(self, filtered_relation=None): if django.VERSION < (2, 0): to_opts = self.rel.to._meta from_opts = self.model._meta - return [PathInfo(from_opts, to_opts, (to_opts.pk,), self, True, False)] + return [PathInfo(from_opts, to_opts, (to_opts.pk,), self, self.multiple, False)] to_opts = self.remote_field.model._meta from_opts = self.model._meta return [ PathInfo( - from_opts, to_opts, (to_opts.pk,), self, True, False, filtered_relation + from_opts, to_opts, (to_opts.pk,), self, self.multiple, False, filtered_relation ) ] diff --git a/tests/tests.py b/tests/tests.py index ce0496f..e622d63 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -364,6 +364,29 @@ def test_single_reverse(self): self.assertIsNone(node_3.next) self.assertIsNone(node_1.prev) + def test_many_to_one_exclude_forward(self): + qs = CartItem.objects.exclude(product__colour="red") + + self.assertEqual(qs.count(), 1) + + def test_single_exclude_forward(self): + node_1 = LinkedNode.objects.create( + name="first node", + prev_id=None, + ) + node_2 = LinkedNode.objects.create( + name="next node", + prev_id=node_1.id, + ) + node_3 = LinkedNode.objects.create( + name="last node", + prev_id=node_2.id, + ) + + qs = LinkedNode.objects.exclude(next__name__contains="last") + + self.assertEqual(qs.count(), 2) + def test_not_nullable(self): item = CartItem.objects.create( pk=4,