#33945: get_previous_in_order and get_next_in_order return incorrect data when
objects is stored in non-default database
-------------------------------------+-------------------------------------
     Reporter:  François Granade     |                    Owner:  Wael
                                     |  Ramadan
         Type:  Bug                  |                   Status:  assigned
    Component:  Database layer       |                  Version:  4.0
  (models, ORM)                      |
     Severity:  Normal               |               Resolution:
     Keywords:                       |             Triage Stage:  Accepted
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Changes (by Carlton Gibson):

 * stage:  Unreviewed => Accepted


Comment:

 OK, I think this is valid. `Model._get_next_or_previous_in_order()`
 doesn't apply `using()` at all.
 
[https://github.com/django/django/blob/e9fd2b572410b1236da0d3d0933014138d89f44e/django/db/models/base.py#L1170-L1191
 src]

 Reproduces with the following diff:


 {{{
 diff --git a/tests/multiple_database/models.py
 b/tests/multiple_database/models.py
 index 7de784e149..4c8bdffb96 100644
 --- a/tests/multiple_database/models.py
 +++ b/tests/multiple_database/models.py
 @@ -79,3 +79,18 @@ class UserProfile(models.Model):

      class Meta:
          ordering = ("flavor",)
 +
 +
 +class Question(models.Model):
 +    text = models.CharField(max_length=200)
 +
 +
 +class Answer(models.Model):
 +    text = models.CharField(max_length=200)
 +    question = models.ForeignKey(Question, models.CASCADE)
 +
 +    class Meta:
 +        order_with_respect_to = "question"
 +
 +    def __str__(self):
 +        return self.text
 diff --git a/tests/multiple_database/tests.py
 b/tests/multiple_database/tests.py
 index 7a9ff4da4e..8bf30c6fd9 100644
 --- a/tests/multiple_database/tests.py
 +++ b/tests/multiple_database/tests.py
 @@ -12,7 +12,7 @@ from django.db.models import signals
  from django.db.utils import ConnectionRouter
  from django.test import SimpleTestCase, TestCase, override_settings

 -from .models import Book, Person, Pet, Review, UserProfile
 +from .models import Book, Person, Pet, Review, UserProfile, Question,
 Answer
  from .routers import AuthRouter, TestRouter, WriteRouter


 @@ -2503,6 +2503,17 @@ class RouteForWriteTestCase(TestCase):
          self.assertEqual(e.model, Book)
          self.assertEqual(e.hints, {"instance": auth})

 +    def test_order_with_respect_to(self):
 +        q = Question.objects.using("other").create(text="The question")
 +        a1 = Answer.objects.using("other").create(text="Answer 1",
 question=q)
 +        a2 = Answer.objects.using("other").create(text="Answer 2",
 question=q)
 +        a3 = Answer.objects.using("other").create(text="Answer 3",
 question=q)
 +        q.set_answer_order([a1.pk, a2.pk, a3.pk], "other")
 +
 +        a2.refresh_from_db()
 +        self.assertIs(a2.get_next_in_order(), a3)
 +        self.assertIs(a2.get_previous_in_order(), a1)
 +

  class NoRelationRouter:
      """Disallow all relations."""
 }}}

 Let's accept to investigate.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/33945#comment:2>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/01070182c5d103c9-d616f1a9-fa48-4b13-b31a-27fffcd640f9-000000%40eu-central-1.amazonses.com.

Reply via email to