1
0
mirror of https://github.com/django/django.git synced 2025-07-04 17:59:13 +00:00

[soc2010/query-refactor] Introced NativeAutoField, also started with some basic MongoDB tests (really just very basic ORM tests), and introduced various APIs into the mongodb backend that were necessary for running unittests.

git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2010/query-refactor@13338 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Alex Gaynor 2010-06-09 15:31:19 +00:00
parent defc494810
commit 89fb7aa310
8 changed files with 75 additions and 20 deletions

View File

@ -1,8 +1,9 @@
from pymongo import Connection
from django.db.backends import BaseDatabaseWrapper
from django.db.backends import BaseDatabaseWrapper, BaseDatabaseValidation
from django.db.backends.signals import connection_created
from django.contrib.mongodb.creation import DatabaseCreation
from django.contrib.mongodb.introspection import DatabaseIntrospection
from django.utils.importlib import import_module
@ -12,9 +13,11 @@ class DatabaseFeatures(object):
class DatabaseOperations(object):
compiler_module = "django.contrib.mongodb.compiler"
sql_ddl = False
def __init__(self, *args, **kwargs):
def __init__(self, connection):
self._cache = {}
self.connection = connection
def max_name_length(self):
return 254
@ -35,12 +38,22 @@ class DatabaseOperations(object):
)
return self._cache[compiler_name]
def flush(self, only_django=False):
if only_django:
tables = self.connection.introspection.django_table_names(only_existing=True)
else:
tables = self.connection.introspection.table_names()
for table in tables:
self.connection.db.drop_collection(table)
class DatabaseWrapper(BaseDatabaseWrapper):
def __init__(self, *args, **kwargs):
super(DatabaseWrapper, self).__init__(*args, **kwargs)
self.features = DatabaseFeatures()
self.ops = DatabaseOperations()
self.ops = DatabaseOperations(self)
self.creation = DatabaseCreation(self)
self.validation = BaseDatabaseValidation(self)
self.introspection = DatabaseIntrospection(self)
self._connection = None
@property

View File

@ -11,6 +11,7 @@ class DatabaseCreation(object):
else:
test_database_name = TEST_DATABASE_PREFIX + self.connection.settings_dict['NAME']
self.connection.settings_dict["NAME"] = test_database_name
self.connection.settings_dict["SUPPORTS_TRANSACTIONS"] = False
return test_database_name
def destroy_test_db(self, old_database_name, verbosity=1):

View File

@ -0,0 +1,6 @@
from django.db.backends import BaseDatabaseIntrospection
class DatabaseIntrospection(BaseDatabaseIntrospection):
def table_names(self):
return self.connection.db.collection_names()

View File

@ -36,8 +36,6 @@ class Command(NoArgsCommand):
except ImportError:
pass
sql_list = sql_flush(self.style, connection, only_django=True)
if interactive:
confirm = raw_input("""You have requested a flush of the database.
This will IRREVERSIBLY DESTROY all data currently in the %r database,
@ -49,6 +47,11 @@ Are you sure you want to do this?
confirm = 'yes'
if confirm == 'yes':
# TODO: HACK, make this more OO.
if not getattr(connection.ops, "sql_ddl", True):
connection.ops.flush(only_django=True)
return
sql_list = sql_flush(self.style, connection, only_django=True)
try:
cursor = connection.cursor()
for sql in sql_list:

View File

@ -447,17 +447,32 @@ class Field(object):
"Returns the value of this field in the given model instance."
return getattr(obj, self.attname)
class AutoField(Field):
class BaseAutoField(Field):
empty_strings_allowed = False
def __init__(self, *args, **kwargs):
assert kwargs.get('primary_key'), "%ss must have primary_key=True." % self.__class__.__name__
kwargs['blank'] = True
super(BaseAutoField, self).__init__(*args, **kwargs)
def contribute_to_class(self, cls, name):
assert not cls._meta.has_auto_field, "A model can't have more than one AutoField."
super(BaseAutoField, self).contribute_to_class(cls, name)
cls._meta.has_auto_field = True
cls._meta.auto_field = self
def get_internal_type(self):
return "AutoField"
def formfield(self, **kwargs):
return None
class AutoField(BaseAutoField):
description = _("Integer")
empty_strings_allowed = False
default_error_messages = {
'invalid': _(u'This value must be an integer.'),
}
def __init__(self, *args, **kwargs):
assert kwargs.get('primary_key', False) is True, "%ss must have primary_key=True." % self.__class__.__name__
kwargs['blank'] = True
Field.__init__(self, *args, **kwargs)
def to_python(self, value):
if value is None:
@ -475,14 +490,10 @@ class AutoField(Field):
return None
return int(value)
def contribute_to_class(self, cls, name):
assert not cls._meta.has_auto_field, "A model can't have more than one AutoField."
super(AutoField, self).contribute_to_class(cls, name)
cls._meta.has_auto_field = True
cls._meta.auto_field = self
def formfield(self, **kwargs):
return None
class NativeAutoField(BaseAutoField):
# TODO: eventually delegate validation and other such things to the
# backends. For now it's enough that this class exists.
pass
class BooleanField(Field):
empty_strings_allowed = False

View File

@ -0,0 +1,10 @@
from django.db import models
class Artist(models.Model):
id = models.NativeAutoField(primary_key=True)
name = models.CharField(max_length=255)
good = models.BooleanField()
def __unicode__(self):
return self.name

View File

@ -0,0 +1,11 @@
from django.test import TestCase
from models import Artist
class MongoTestCase(TestCase):
def test_create(self):
b = Artist.objects.create(name="Bruce Springsteen", good=True)
self.assertTrue(b.pk is not None)
self.assertEqual(b.name, "Bruce Springsteen")
self.assertTrue(b.good)