diff --git a/django/db/models/options.py b/django/db/models/options.py index a5f42804182..4f04746200c 100644 --- a/django/db/models/options.py +++ b/django/db/models/options.py @@ -167,7 +167,8 @@ class Options(object): if self.order_with_respect_to: self.order_with_respect_to = self.get_field(self.order_with_respect_to) self.ordering = ('_order',) - model.add_to_class('_order', OrderWrt()) + if not any(isinstance(field, OrderWrt) for field in model._meta.local_fields): + model.add_to_class('_order', OrderWrt()) else: self.order_with_respect_to = None diff --git a/tests/order_with_respect_to/tests.py b/tests/order_with_respect_to/tests.py index 444caee1420..2d5e85cb04e 100644 --- a/tests/order_with_respect_to/tests.py +++ b/tests/order_with_respect_to/tests.py @@ -4,6 +4,8 @@ from operator import attrgetter from django.test import TestCase +from django.db import models + from .models import Post, Question, Answer @@ -71,3 +73,22 @@ class OrderWithRespectToTests(TestCase): Post.objects.create(title="2.1", parent=p2) p1_3 = Post.objects.create(title="1.3", parent=p1) self.assertEqual(p1.get_post_order(), [p1_1.pk, p1_2.pk, p1_3.pk]) + + def test_duplicate_order_field(self): + + class Bar(models.Model): + pass + + class Foo(models.Model): + bar = models.ForeignKey(Bar) + order = models.OrderWrt() + + class Meta: + order_with_respect_to = 'bar' + + count = 0 + for field in Foo._meta.local_fields: + if isinstance(field, models.OrderWrt): + count += 1 + + self.assertEqual(count, 1)