Skip to content

Commit 2930936

Browse files
committed
Support negated filters on one-to-one Relationships
1 parent fac0761 commit 2930936

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

relativity/fields.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -402,15 +402,17 @@ def contribute_to_class(self, cls, name, **kwargs):
402402
setattr(cls, self.name, self.accessor_class(self))
403403

404404
def get_path_info(self, filtered_relation=None):
405+
is_m2m = self.multiple or self.reverse_multiple
406+
405407
if django.VERSION < (2, 0):
406408
to_opts = self.rel.to._meta
407409
from_opts = self.model._meta
408-
return [PathInfo(from_opts, to_opts, (to_opts.pk,), self, True, False)]
410+
return [PathInfo(from_opts, to_opts, (to_opts.pk,), self, is_m2m, False)]
409411
to_opts = self.remote_field.model._meta
410412
from_opts = self.model._meta
411413
return [
412414
PathInfo(
413-
from_opts, to_opts, (to_opts.pk,), self, True, False, filtered_relation
415+
from_opts, to_opts, (to_opts.pk,), self, is_m2m, False, filtered_relation
414416
)
415417
]
416418

tests/tests.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,24 @@ def test_single_reverse(self):
364364
self.assertIsNone(node_3.next)
365365
self.assertIsNone(node_1.prev)
366366

367+
def test_single_exclude_forward(self):
368+
node_1 = LinkedNode.objects.create(
369+
name="first node",
370+
prev_id=None,
371+
)
372+
node_2 = LinkedNode.objects.create(
373+
name="next node",
374+
prev_id=node_1.id,
375+
)
376+
node_3 = LinkedNode.objects.create(
377+
name="last node",
378+
prev_id=node_2.id,
379+
)
380+
381+
qs = LinkedNode.objects.exclude(next__name__contains="last")
382+
383+
self.assertEqual(qs.count(), 2)
384+
367385
def test_not_nullable(self):
368386
item = CartItem.objects.create(
369387
pk=4,

0 commit comments

Comments
 (0)