From e07def14b82b065f010a251cfbc8b3881f3c4d85 Mon Sep 17 00:00:00 2001 From: Tim Graham Date: Fri, 20 Nov 2015 11:31:39 -0500 Subject: [PATCH] Refs #25786 -- Added tests/release notes for set_FOO_order() crash with order_with_respect_to referencing OneToOneField pk. Forwardport of 6d9f061b07ce7aa1a9da6799b3104971ee73998b from stable/1.8.x The issue was fixed by 7bec480fe2ace94c8e7f0c88485442bfa74436b4. --- docs/releases/1.8.7.txt | 4 ++++ tests/order_with_respect_to/models.py | 16 ++++++++++++++++ tests/order_with_respect_to/tests.py | 12 +++++++++++- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/docs/releases/1.8.7.txt b/docs/releases/1.8.7.txt index df0ff41159..b11ea9781a 100644 --- a/docs/releases/1.8.7.txt +++ b/docs/releases/1.8.7.txt @@ -42,3 +42,7 @@ Bugfixes * Fixed a duplicate query regression in 1.8 on proxied model deletion (:ticket:`25685`). + +* Fixed ``set_FOO_order()`` crash when the ``ForeignKey`` of a model with + ``order_with_respect_to`` references a model with a ``OneToOneField`` + primary key (:ticket:`25786`). diff --git a/tests/order_with_respect_to/models.py b/tests/order_with_respect_to/models.py index 5f531a32a5..742818337c 100644 --- a/tests/order_with_respect_to/models.py +++ b/tests/order_with_respect_to/models.py @@ -42,3 +42,19 @@ class Post(models.Model): def __str__(self): return self.title + + +# order_with_respect_to points to a model with a OneToOneField primary key. +class Entity(models.Model): + pass + + +class Dimension(models.Model): + entity = models.OneToOneField('Entity', primary_key=True, on_delete=models.CASCADE) + + +class Component(models.Model): + dimension = models.ForeignKey('Dimension', on_delete=models.CASCADE) + + class Meta: + order_with_respect_to = 'dimension' diff --git a/tests/order_with_respect_to/tests.py b/tests/order_with_respect_to/tests.py index 8f01660180..6157f51d4e 100644 --- a/tests/order_with_respect_to/tests.py +++ b/tests/order_with_respect_to/tests.py @@ -6,7 +6,7 @@ from django.apps.registry import Apps from django.db import models from django.test import TestCase -from .models import Answer, Post, Question +from .models import Answer, Dimension, Entity, Post, Question class OrderWithRespectToTests(TestCase): @@ -118,3 +118,13 @@ class OrderWithRespectToTests2(TestCase): count += 1 self.assertEqual(count, 1) + + +class TestOrderWithRespectToOneToOnePK(TestCase): + def test_set_order(self): + e = Entity.objects.create() + d = Dimension.objects.create(entity=e) + c1 = d.component_set.create() + c2 = d.component_set.create() + d.set_component_order([c1.id, c2.id]) + self.assertQuerysetEqual(d.component_set.all(), [c1.id, c2.id], attrgetter('pk'))