/tests/modeltests/custom_pk/tests.py

https://code.google.com/p/mango-py/ · Python · 180 lines · 142 code · 22 blank · 16 comment · 0 complexity · 9dcc3317b6d2f551034f52a34aebc35b MD5 · raw file

  1. # -*- coding: utf-8 -*-
  2. from django.conf import settings
  3. from django.db import DEFAULT_DB_ALIAS, transaction, IntegrityError
  4. from django.test import TestCase, skipIfDBFeature
  5. from models import Employee, Business, Bar, Foo
  6. class CustomPKTests(TestCase):
  7. def test_custom_pk(self):
  8. dan = Employee.objects.create(
  9. employee_code=123, first_name="Dan", last_name="Jones"
  10. )
  11. self.assertQuerysetEqual(
  12. Employee.objects.all(), [
  13. "Dan Jones",
  14. ],
  15. unicode
  16. )
  17. fran = Employee.objects.create(
  18. employee_code=456, first_name="Fran", last_name="Bones"
  19. )
  20. self.assertQuerysetEqual(
  21. Employee.objects.all(), [
  22. "Fran Bones",
  23. "Dan Jones",
  24. ],
  25. unicode
  26. )
  27. self.assertEqual(Employee.objects.get(pk=123), dan)
  28. self.assertEqual(Employee.objects.get(pk=456), fran)
  29. self.assertRaises(Employee.DoesNotExist,
  30. lambda: Employee.objects.get(pk=42)
  31. )
  32. # Use the name of the primary key, rather than pk.
  33. self.assertEqual(Employee.objects.get(employee_code=123), dan)
  34. # pk can be used as a substitute for the primary key.
  35. self.assertQuerysetEqual(
  36. Employee.objects.filter(pk__in=[123, 456]), [
  37. "Fran Bones",
  38. "Dan Jones",
  39. ],
  40. unicode
  41. )
  42. # The primary key can be accessed via the pk property on the model.
  43. e = Employee.objects.get(pk=123)
  44. self.assertEqual(e.pk, 123)
  45. # Or we can use the real attribute name for the primary key:
  46. self.assertEqual(e.employee_code, 123)
  47. # Fran got married and changed her last name.
  48. fran = Employee.objects.get(pk=456)
  49. fran.last_name = "Jones"
  50. fran.save()
  51. self.assertQuerysetEqual(
  52. Employee.objects.filter(last_name="Jones"), [
  53. "Dan Jones",
  54. "Fran Jones",
  55. ],
  56. unicode
  57. )
  58. emps = Employee.objects.in_bulk([123, 456])
  59. self.assertEqual(emps[123], dan)
  60. b = Business.objects.create(name="Sears")
  61. b.employees.add(dan, fran)
  62. self.assertQuerysetEqual(
  63. b.employees.all(), [
  64. "Dan Jones",
  65. "Fran Jones",
  66. ],
  67. unicode
  68. )
  69. self.assertQuerysetEqual(
  70. fran.business_set.all(), [
  71. "Sears",
  72. ],
  73. lambda b: b.name
  74. )
  75. self.assertEqual(Business.objects.in_bulk(["Sears"]), {
  76. "Sears": b,
  77. })
  78. self.assertQuerysetEqual(
  79. Business.objects.filter(name="Sears"), [
  80. "Sears"
  81. ],
  82. lambda b: b.name
  83. )
  84. self.assertQuerysetEqual(
  85. Business.objects.filter(pk="Sears"), [
  86. "Sears",
  87. ],
  88. lambda b: b.name
  89. )
  90. # Queries across tables, involving primary key
  91. self.assertQuerysetEqual(
  92. Employee.objects.filter(business__name="Sears"), [
  93. "Dan Jones",
  94. "Fran Jones",
  95. ],
  96. unicode,
  97. )
  98. self.assertQuerysetEqual(
  99. Employee.objects.filter(business__pk="Sears"), [
  100. "Dan Jones",
  101. "Fran Jones",
  102. ],
  103. unicode,
  104. )
  105. self.assertQuerysetEqual(
  106. Business.objects.filter(employees__employee_code=123), [
  107. "Sears",
  108. ],
  109. lambda b: b.name
  110. )
  111. self.assertQuerysetEqual(
  112. Business.objects.filter(employees__pk=123), [
  113. "Sears",
  114. ],
  115. lambda b: b.name,
  116. )
  117. self.assertQuerysetEqual(
  118. Business.objects.filter(employees__first_name__startswith="Fran"), [
  119. "Sears",
  120. ],
  121. lambda b: b.name
  122. )
  123. def test_unicode_pk(self):
  124. # Primary key may be unicode string
  125. bus = Business.objects.create(name=u'ja???„')
  126. def test_unique_pk(self):
  127. # The primary key must also obviously be unique, so trying to create a
  128. # new object with the same primary key will fail.
  129. e = Employee.objects.create(
  130. employee_code=123, first_name="Frank", last_name="Jones"
  131. )
  132. sid = transaction.savepoint()
  133. self.assertRaises(IntegrityError,
  134. Employee.objects.create, employee_code=123, first_name="Fred", last_name="Jones"
  135. )
  136. transaction.savepoint_rollback(sid)
  137. def test_custom_field_pk(self):
  138. # Regression for #10785 -- Custom fields can be used for primary keys.
  139. new_bar = Bar.objects.create()
  140. new_foo = Foo.objects.create(bar=new_bar)
  141. f = Foo.objects.get(bar=new_bar.pk)
  142. self.assertEqual(f, new_foo)
  143. self.assertEqual(f.bar, new_bar)
  144. f = Foo.objects.get(bar=new_bar)
  145. self.assertEqual(f, new_foo),
  146. self.assertEqual(f.bar, new_bar)
  147. # SQLite lets objects be saved with an empty primary key, even though an
  148. # integer is expected. So we can't check for an error being raised in that
  149. # case for SQLite. Remove it from the suite for this next bit.
  150. @skipIfDBFeature('supports_unspecified_pk')
  151. def test_required_pk(self):
  152. # The primary key must be specified, so an error is raised if you
  153. # try to create an object without it.
  154. sid = transaction.savepoint()
  155. self.assertRaises(IntegrityError,
  156. Employee.objects.create, first_name="Tom", last_name="Smith"
  157. )
  158. transaction.savepoint_rollback(sid)