mirror of https://github.com/django/django.git
Refs #18586 -- Split custom_pk test.
This commit is contained in:
parent
3bb78c5e7a
commit
f66d9a2300
|
@ -8,40 +8,36 @@ from django.utils import six
|
||||||
from .models import Employee, Business, Bar, Foo
|
from .models import Employee, Business, Bar, Foo
|
||||||
|
|
||||||
|
|
||||||
class CustomPKTests(TestCase):
|
class BasicCustomPKTests(TestCase):
|
||||||
def test_custom_pk(self):
|
@classmethod
|
||||||
dan = Employee.objects.create(
|
def setUpTestData(cls):
|
||||||
employee_code=123, first_name="Dan", last_name="Jones"
|
cls.dan = Employee.objects.create(
|
||||||
|
employee_code=123, first_name="Dan", last_name="Jones",
|
||||||
)
|
)
|
||||||
|
cls.fran = Employee.objects.create(
|
||||||
|
employee_code=456, first_name="Fran", last_name="Bones",
|
||||||
|
)
|
||||||
|
cls.business = Business.objects.create(name="Sears")
|
||||||
|
cls.business.employees.add(cls.dan, cls.fran)
|
||||||
|
|
||||||
|
def test_querysets(self):
|
||||||
|
"""
|
||||||
|
Both pk and custom attribute_name can be used in filter and friends
|
||||||
|
"""
|
||||||
self.assertQuerysetEqual(
|
self.assertQuerysetEqual(
|
||||||
Employee.objects.all(), [
|
Employee.objects.filter(pk=123), [
|
||||||
"Dan Jones",
|
"Dan Jones",
|
||||||
],
|
],
|
||||||
six.text_type
|
six.text_type
|
||||||
)
|
)
|
||||||
|
|
||||||
fran = Employee.objects.create(
|
|
||||||
employee_code=456, first_name="Fran", last_name="Bones"
|
|
||||||
)
|
|
||||||
self.assertQuerysetEqual(
|
self.assertQuerysetEqual(
|
||||||
Employee.objects.all(), [
|
Employee.objects.filter(employee_code=123), [
|
||||||
"Fran Bones",
|
|
||||||
"Dan Jones",
|
"Dan Jones",
|
||||||
],
|
],
|
||||||
six.text_type
|
six.text_type
|
||||||
)
|
)
|
||||||
|
|
||||||
self.assertEqual(Employee.objects.get(pk=123), dan)
|
|
||||||
self.assertEqual(Employee.objects.get(pk=456), fran)
|
|
||||||
|
|
||||||
self.assertRaises(
|
|
||||||
Employee.DoesNotExist,
|
|
||||||
lambda: Employee.objects.get(pk=42)
|
|
||||||
)
|
|
||||||
|
|
||||||
# Use the name of the primary key, rather than pk.
|
|
||||||
self.assertEqual(Employee.objects.get(employee_code=123), dan)
|
|
||||||
# pk can be used as a substitute for the primary key.
|
|
||||||
self.assertQuerysetEqual(
|
self.assertQuerysetEqual(
|
||||||
Employee.objects.filter(pk__in=[123, 456]), [
|
Employee.objects.filter(pk__in=[123, 456]), [
|
||||||
"Fran Bones",
|
"Fran Bones",
|
||||||
|
@ -49,48 +45,15 @@ class CustomPKTests(TestCase):
|
||||||
],
|
],
|
||||||
six.text_type
|
six.text_type
|
||||||
)
|
)
|
||||||
# The primary key can be accessed via the pk property on the model.
|
|
||||||
e = Employee.objects.get(pk=123)
|
|
||||||
self.assertEqual(e.pk, 123)
|
|
||||||
# Or we can use the real attribute name for the primary key:
|
|
||||||
self.assertEqual(e.employee_code, 123)
|
|
||||||
|
|
||||||
# Fran got married and changed her last name.
|
|
||||||
fran = Employee.objects.get(pk=456)
|
|
||||||
fran.last_name = "Jones"
|
|
||||||
fran.save()
|
|
||||||
|
|
||||||
self.assertQuerysetEqual(
|
self.assertQuerysetEqual(
|
||||||
Employee.objects.filter(last_name="Jones"), [
|
Employee.objects.all(), [
|
||||||
|
"Fran Bones",
|
||||||
"Dan Jones",
|
"Dan Jones",
|
||||||
"Fran Jones",
|
|
||||||
],
|
],
|
||||||
six.text_type
|
six.text_type
|
||||||
)
|
)
|
||||||
|
|
||||||
emps = Employee.objects.in_bulk([123, 456])
|
|
||||||
self.assertEqual(emps[123], dan)
|
|
||||||
|
|
||||||
b = Business.objects.create(name="Sears")
|
|
||||||
b.employees.add(dan, fran)
|
|
||||||
self.assertQuerysetEqual(
|
|
||||||
b.employees.all(), [
|
|
||||||
"Dan Jones",
|
|
||||||
"Fran Jones",
|
|
||||||
],
|
|
||||||
six.text_type
|
|
||||||
)
|
|
||||||
self.assertQuerysetEqual(
|
|
||||||
fran.business_set.all(), [
|
|
||||||
"Sears",
|
|
||||||
],
|
|
||||||
lambda b: b.name
|
|
||||||
)
|
|
||||||
|
|
||||||
self.assertEqual(Business.objects.in_bulk(["Sears"]), {
|
|
||||||
"Sears": b,
|
|
||||||
})
|
|
||||||
|
|
||||||
self.assertQuerysetEqual(
|
self.assertQuerysetEqual(
|
||||||
Business.objects.filter(name="Sears"), [
|
Business.objects.filter(name="Sears"), [
|
||||||
"Sears"
|
"Sears"
|
||||||
|
@ -104,18 +67,39 @@ class CustomPKTests(TestCase):
|
||||||
lambda b: b.name
|
lambda b: b.name
|
||||||
)
|
)
|
||||||
|
|
||||||
# Queries across tables, involving primary key
|
def test_querysets_related_name(self):
|
||||||
|
"""
|
||||||
|
Custom pk doesn't affect related_name based lookups
|
||||||
|
"""
|
||||||
|
self.assertQuerysetEqual(
|
||||||
|
self.business.employees.all(), [
|
||||||
|
"Fran Bones",
|
||||||
|
"Dan Jones",
|
||||||
|
],
|
||||||
|
six.text_type
|
||||||
|
)
|
||||||
|
self.assertQuerysetEqual(
|
||||||
|
self.fran.business_set.all(), [
|
||||||
|
"Sears",
|
||||||
|
],
|
||||||
|
lambda b: b.name
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_querysets_relational(self):
|
||||||
|
"""
|
||||||
|
Queries across tables, involving primary key
|
||||||
|
"""
|
||||||
self.assertQuerysetEqual(
|
self.assertQuerysetEqual(
|
||||||
Employee.objects.filter(business__name="Sears"), [
|
Employee.objects.filter(business__name="Sears"), [
|
||||||
|
"Fran Bones",
|
||||||
"Dan Jones",
|
"Dan Jones",
|
||||||
"Fran Jones",
|
|
||||||
],
|
],
|
||||||
six.text_type,
|
six.text_type,
|
||||||
)
|
)
|
||||||
self.assertQuerysetEqual(
|
self.assertQuerysetEqual(
|
||||||
Employee.objects.filter(business__pk="Sears"), [
|
Employee.objects.filter(business__pk="Sears"), [
|
||||||
|
"Fran Bones",
|
||||||
"Dan Jones",
|
"Dan Jones",
|
||||||
"Fran Jones",
|
|
||||||
],
|
],
|
||||||
six.text_type,
|
six.text_type,
|
||||||
)
|
)
|
||||||
|
@ -140,6 +124,73 @@ class CustomPKTests(TestCase):
|
||||||
lambda b: b.name
|
lambda b: b.name
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_get(self):
|
||||||
|
"""
|
||||||
|
Get can accept pk or the real attribute name
|
||||||
|
"""
|
||||||
|
self.assertEqual(Employee.objects.get(pk=123), self.dan)
|
||||||
|
self.assertEqual(Employee.objects.get(pk=456), self.fran)
|
||||||
|
|
||||||
|
self.assertRaises(
|
||||||
|
Employee.DoesNotExist,
|
||||||
|
lambda: Employee.objects.get(pk=42)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Use the name of the primary key, rather than pk.
|
||||||
|
self.assertEqual(Employee.objects.get(employee_code=123), self.dan)
|
||||||
|
|
||||||
|
def test_pk_attributes(self):
|
||||||
|
"""
|
||||||
|
pk and attribute name are available on the model
|
||||||
|
No default id attribute is added
|
||||||
|
"""
|
||||||
|
# pk can be used as a substitute for the primary key.
|
||||||
|
# The primary key can be accessed via the pk property on the model.
|
||||||
|
e = Employee.objects.get(pk=123)
|
||||||
|
self.assertEqual(e.pk, 123)
|
||||||
|
# Or we can use the real attribute name for the primary key:
|
||||||
|
self.assertEqual(e.employee_code, 123)
|
||||||
|
|
||||||
|
self.assertRaises(AttributeError, lambda: e.id)
|
||||||
|
|
||||||
|
def test_in_bulk(self):
|
||||||
|
"""
|
||||||
|
Custom pks work with in_bulk, both for integer and non-integer types
|
||||||
|
"""
|
||||||
|
emps = Employee.objects.in_bulk([123, 456])
|
||||||
|
self.assertEqual(emps[123], self.dan)
|
||||||
|
|
||||||
|
self.assertEqual(Business.objects.in_bulk(["Sears"]), {
|
||||||
|
"Sears": self.business,
|
||||||
|
})
|
||||||
|
|
||||||
|
def test_save(self):
|
||||||
|
"""
|
||||||
|
custom pks do not affect save
|
||||||
|
"""
|
||||||
|
fran = Employee.objects.get(pk=456)
|
||||||
|
fran.last_name = "Jones"
|
||||||
|
fran.save()
|
||||||
|
|
||||||
|
self.assertQuerysetEqual(
|
||||||
|
Employee.objects.filter(last_name="Jones"), [
|
||||||
|
"Dan Jones",
|
||||||
|
"Fran Jones",
|
||||||
|
],
|
||||||
|
six.text_type
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class CustomPKTests(TestCase):
|
||||||
|
def test_custom_pk_create(self):
|
||||||
|
"""
|
||||||
|
New objects can be created both with pk and the custom name
|
||||||
|
"""
|
||||||
|
Employee.objects.create(employee_code=1234, first_name="Foo", last_name="Bar")
|
||||||
|
Employee.objects.create(pk=1235, first_name="Foo", last_name="Baz")
|
||||||
|
Business.objects.create(name="Bears")
|
||||||
|
Business.objects.create(pk="Tears")
|
||||||
|
|
||||||
def test_unicode_pk(self):
|
def test_unicode_pk(self):
|
||||||
# Primary key may be unicode string
|
# Primary key may be unicode string
|
||||||
Business.objects.create(name='jaźń')
|
Business.objects.create(name='jaźń')
|
||||||
|
|
Loading…
Reference in New Issue