mirror of
https://github.com/django/django.git
synced 2025-10-24 14:16:09 +00:00
Fixed #10414 -- Made select_related() fail on invalid field names.
This commit is contained in:
committed by
Tim Graham
parent
b27db97b23
commit
3daa9d60be
@@ -1,8 +1,12 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.test import TestCase
|
||||
from django.core.exceptions import FieldError
|
||||
|
||||
from .models import Domain, Kingdom, Phylum, Klass, Order, Family, Genus, Species, HybridSpecies
|
||||
from .models import (
|
||||
Domain, Kingdom, Phylum, Klass, Order, Family, Genus, Species, HybridSpecies,
|
||||
Pizza, TaggedItem, Bookmark,
|
||||
)
|
||||
|
||||
|
||||
class SelectRelatedTests(TestCase):
|
||||
@@ -126,6 +130,12 @@ class SelectRelatedTests(TestCase):
|
||||
orders = [o.genus.family.order.name for o in world]
|
||||
self.assertEqual(orders, ['Agaricales'])
|
||||
|
||||
def test_single_related_field(self):
|
||||
with self.assertNumQueries(1):
|
||||
species = Species.objects.select_related('genus__name')
|
||||
names = [s.genus.name for s in species]
|
||||
self.assertEqual(sorted(names), ['Amanita', 'Drosophila', 'Homo', 'Pisum'])
|
||||
|
||||
def test_field_traversal(self):
|
||||
with self.assertNumQueries(1):
|
||||
s = (Species.objects.all()
|
||||
@@ -152,3 +162,47 @@ class SelectRelatedTests(TestCase):
|
||||
obj = queryset[0]
|
||||
self.assertEqual(obj.parent_1, parent_1)
|
||||
self.assertEqual(obj.parent_2, parent_2)
|
||||
|
||||
|
||||
class SelectRelatedValidationTests(TestCase):
|
||||
"""
|
||||
select_related() should thrown an error on fields that do not exist and
|
||||
non-relational fields.
|
||||
"""
|
||||
non_relational_error = "Non-relational field given in select_related: '%s'. Choices are: %s"
|
||||
invalid_error = "Invalid field name(s) given in select_related: '%s'. Choices are: %s"
|
||||
|
||||
def test_non_relational_field(self):
|
||||
with self.assertRaisesMessage(FieldError, self.non_relational_error % ('name', 'genus')):
|
||||
list(Species.objects.select_related('name__some_field'))
|
||||
|
||||
with self.assertRaisesMessage(FieldError, self.non_relational_error % ('name', 'genus')):
|
||||
list(Species.objects.select_related('name'))
|
||||
|
||||
with self.assertRaisesMessage(FieldError, self.non_relational_error % ('name', '(none)')):
|
||||
list(Domain.objects.select_related('name'))
|
||||
|
||||
def test_many_to_many_field(self):
|
||||
with self.assertRaisesMessage(FieldError, self.invalid_error % ('toppings', '(none)')):
|
||||
list(Pizza.objects.select_related('toppings'))
|
||||
|
||||
def test_reverse_relational_field(self):
|
||||
with self.assertRaisesMessage(FieldError, self.invalid_error % ('child_1', 'genus')):
|
||||
list(Species.objects.select_related('child_1'))
|
||||
|
||||
def test_invalid_field(self):
|
||||
with self.assertRaisesMessage(FieldError, self.invalid_error % ('invalid_field', 'genus')):
|
||||
list(Species.objects.select_related('invalid_field'))
|
||||
|
||||
with self.assertRaisesMessage(FieldError, self.invalid_error % ('related_invalid_field', 'family')):
|
||||
list(Species.objects.select_related('genus__related_invalid_field'))
|
||||
|
||||
with self.assertRaisesMessage(FieldError, self.invalid_error % ('invalid_field', '(none)')):
|
||||
list(Domain.objects.select_related('invalid_field'))
|
||||
|
||||
def test_generic_relations(self):
|
||||
with self.assertRaisesMessage(FieldError, self.invalid_error % ('tags', '')):
|
||||
list(Bookmark.objects.select_related('tags'))
|
||||
|
||||
with self.assertRaisesMessage(FieldError, self.invalid_error % ('content_object', 'content_type')):
|
||||
list(TaggedItem.objects.select_related('content_object'))
|
||||
|
||||
Reference in New Issue
Block a user