diff options
Diffstat (limited to 'parts/django/tests/modeltests/custom_pk')
-rw-r--r-- | parts/django/tests/modeltests/custom_pk/__init__.py | 0 | ||||
-rw-r--r-- | parts/django/tests/modeltests/custom_pk/fields.py | 55 | ||||
-rw-r--r-- | parts/django/tests/modeltests/custom_pk/models.py | 42 | ||||
-rw-r--r-- | parts/django/tests/modeltests/custom_pk/tests.py | 183 |
4 files changed, 0 insertions, 280 deletions
diff --git a/parts/django/tests/modeltests/custom_pk/__init__.py b/parts/django/tests/modeltests/custom_pk/__init__.py deleted file mode 100644 index e69de29..0000000 --- a/parts/django/tests/modeltests/custom_pk/__init__.py +++ /dev/null diff --git a/parts/django/tests/modeltests/custom_pk/fields.py b/parts/django/tests/modeltests/custom_pk/fields.py deleted file mode 100644 index 2eeb80e..0000000 --- a/parts/django/tests/modeltests/custom_pk/fields.py +++ /dev/null @@ -1,55 +0,0 @@ -import random -import string - -from django.db import models - - -class MyWrapper(object): - def __init__(self, value): - self.value = value - - def __repr__(self): - return "<%s: %s>" % (self.__class__.__name__, self.value) - - def __unicode__(self): - return self.value - - def __eq__(self, other): - if isinstance(other, self.__class__): - return self.value == other.value - return self.value == other - -class MyAutoField(models.CharField): - __metaclass__ = models.SubfieldBase - - def __init__(self, *args, **kwargs): - kwargs['max_length'] = 10 - super(MyAutoField, self).__init__(*args, **kwargs) - - def pre_save(self, instance, add): - value = getattr(instance, self.attname, None) - if not value: - value = MyWrapper(''.join(random.sample(string.lowercase, 10))) - setattr(instance, self.attname, value) - return value - - def to_python(self, value): - if not value: - return - if not isinstance(value, MyWrapper): - value = MyWrapper(value) - return value - - def get_db_prep_save(self, value): - if not value: - return - if isinstance(value, MyWrapper): - return unicode(value) - return value - - def get_db_prep_value(self, value): - if not value: - return - if isinstance(value, MyWrapper): - return unicode(value) - return value diff --git a/parts/django/tests/modeltests/custom_pk/models.py b/parts/django/tests/modeltests/custom_pk/models.py deleted file mode 100644 index ff2f2ba..0000000 --- a/parts/django/tests/modeltests/custom_pk/models.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- -""" -14. Using a custom primary key - -By default, Django adds an ``"id"`` field to each model. But you can override -this behavior by explicitly adding ``primary_key=True`` to a field. -""" - -from django.conf import settings -from django.db import models, transaction, IntegrityError, DEFAULT_DB_ALIAS - -from fields import MyAutoField - -class Employee(models.Model): - employee_code = models.IntegerField(primary_key=True, db_column = 'code') - first_name = models.CharField(max_length=20) - last_name = models.CharField(max_length=20) - class Meta: - ordering = ('last_name', 'first_name') - - def __unicode__(self): - return u"%s %s" % (self.first_name, self.last_name) - -class Business(models.Model): - name = models.CharField(max_length=20, primary_key=True) - employees = models.ManyToManyField(Employee) - class Meta: - verbose_name_plural = 'businesses' - - def __unicode__(self): - return self.name - -class Bar(models.Model): - id = MyAutoField(primary_key=True, db_index=True) - - def __unicode__(self): - return repr(self.pk) - - -class Foo(models.Model): - bar = models.ForeignKey(Bar) - diff --git a/parts/django/tests/modeltests/custom_pk/tests.py b/parts/django/tests/modeltests/custom_pk/tests.py deleted file mode 100644 index 6ef4bdd..0000000 --- a/parts/django/tests/modeltests/custom_pk/tests.py +++ /dev/null @@ -1,183 +0,0 @@ -# -*- coding: utf-8 -*- -from django.conf import settings -from django.db import DEFAULT_DB_ALIAS, transaction, IntegrityError -from django.test import TestCase - -from models import Employee, Business, Bar, Foo - - -class CustomPKTests(TestCase): - def test_custom_pk(self): - dan = Employee.objects.create( - employee_code=123, first_name="Dan", last_name="Jones" - ) - self.assertQuerysetEqual( - Employee.objects.all(), [ - "Dan Jones", - ], - unicode - ) - - fran = Employee.objects.create( - employee_code=456, first_name="Fran", last_name="Bones" - ) - self.assertQuerysetEqual( - Employee.objects.all(), [ - "Fran Bones", - "Dan Jones", - ], - unicode - ) - - 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( - Employee.objects.filter(pk__in=[123, 456]), [ - "Fran Bones", - "Dan Jones", - ], - unicode - ) - # 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( - Employee.objects.filter(last_name="Jones"), [ - "Dan Jones", - "Fran Jones", - ], - unicode - ) - - 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", - ], - unicode - ) - self.assertQuerysetEqual( - fran.business_set.all(), [ - "Sears", - ], - lambda b: b.name - ) - - self.assertEqual(Business.objects.in_bulk(["Sears"]), { - "Sears": b, - }) - - self.assertQuerysetEqual( - Business.objects.filter(name="Sears"), [ - "Sears" - ], - lambda b: b.name - ) - self.assertQuerysetEqual( - Business.objects.filter(pk="Sears"), [ - "Sears", - ], - lambda b: b.name - ) - - # Queries across tables, involving primary key - self.assertQuerysetEqual( - Employee.objects.filter(business__name="Sears"), [ - "Dan Jones", - "Fran Jones", - ], - unicode, - ) - self.assertQuerysetEqual( - Employee.objects.filter(business__pk="Sears"), [ - "Dan Jones", - "Fran Jones", - ], - unicode, - ) - - self.assertQuerysetEqual( - Business.objects.filter(employees__employee_code=123), [ - "Sears", - ], - lambda b: b.name - ) - self.assertQuerysetEqual( - Business.objects.filter(employees__pk=123), [ - "Sears", - ], - lambda b: b.name, - ) - - self.assertQuerysetEqual( - Business.objects.filter(employees__first_name__startswith="Fran"), [ - "Sears", - ], - lambda b: b.name - ) - - def test_unicode_pk(self): - # Primary key may be unicode string - bus = Business.objects.create(name=u'jaźń') - - def test_unique_pk(self): - # The primary key must also obviously be unique, so trying to create a - # new object with the same primary key will fail. - e = Employee.objects.create( - employee_code=123, first_name="Frank", last_name="Jones" - ) - sid = transaction.savepoint() - self.assertRaises(IntegrityError, - Employee.objects.create, employee_code=123, first_name="Fred", last_name="Jones" - ) - transaction.savepoint_rollback(sid) - - def test_custom_field_pk(self): - # Regression for #10785 -- Custom fields can be used for primary keys. - new_bar = Bar.objects.create() - new_foo = Foo.objects.create(bar=new_bar) - - # FIXME: This still doesn't work, but will require some changes in - # get_db_prep_lookup to fix it. - # f = Foo.objects.get(bar=new_bar.pk) - # self.assertEqual(f, new_foo) - # self.assertEqual(f.bar, new_bar) - - f = Foo.objects.get(bar=new_bar) - self.assertEqual(f, new_foo), - self.assertEqual(f.bar, new_bar) - - - # SQLite lets objects be saved with an empty primary key, even though an - # integer is expected. So we can't check for an error being raised in that - # case for SQLite. Remove it from the suite for this next bit. - if settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'] != 'django.db.backends.sqlite3': - def test_required_pk(self): - # The primary key must be specified, so an error is raised if you - # try to create an object without it. - sid = transaction.savepoint() - self.assertRaises(IntegrityError, - Employee.objects.create, first_name="Tom", last_name="Smith" - ) - transaction.savepoint_rollback(sid) |