Skip to content

Commit 9944d8d

Browse files
committed
[soc2010/query-refactor] Added a ListField, currently only works on MongoDB.
git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2010/query-refactor@13441 bcc190cf-cafb-0310-a4f2-bffc1f526a37
1 parent 9c6e1c8 commit 9944d8d

File tree

3 files changed

+79
-12
lines changed

3 files changed

+79
-12
lines changed

django/db/models/__init__.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from django.conf import settings
22
from django.core.exceptions import ObjectDoesNotExist, ImproperlyConfigured
33
from django.db import connection
4-
from django.db.models.loading import get_apps, get_app, get_models, get_model, register_models
4+
from django.db.models.loading import (get_apps, get_app, get_models, get_model,
5+
register_models)
56
from django.db.models.query import Q
67
from django.db.models.expressions import F
78
from django.db.models.manager import Manager
@@ -10,7 +11,9 @@
1011
from django.db.models.fields import *
1112
from django.db.models.fields.subclassing import SubfieldBase
1213
from django.db.models.fields.files import FileField, ImageField
13-
from django.db.models.fields.related import ForeignKey, OneToOneField, ManyToManyField, ManyToOneRel, ManyToManyRel, OneToOneRel
14+
from django.db.models.fields.related import (ForeignKey, OneToOneField,
15+
ManyToManyField, ManyToOneRel, ManyToManyRel, OneToOneRel)
16+
from django.db.models.fields.structures import ListField
1417
from django.db.models import signals
1518

1619
# Admin stages.

tests/regressiontests/mongodb/models.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,15 @@ class Group(models.Model):
1919
name = models.CharField(max_length=255)
2020
year_formed = models.IntegerField(null=True)
2121

22+
23+
class Post(models.Model):
24+
id = models.NativeAutoField(primary_key=True)
25+
title = models.CharField(max_length=255)
26+
27+
tags = models.ListField(
28+
models.CharField(max_length=255)
29+
)
30+
31+
magic_numbers = models.ListField(
32+
models.IntegerField()
33+
)

tests/regressiontests/mongodb/tests.py

Lines changed: 62 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,18 @@
22
from django.db.models import Count, Sum, F, Q
33
from django.test import TestCase
44

5-
from models import Artist, Group
5+
from models import Artist, Group, Post
66

77

88
class MongoTestCase(TestCase):
9+
def assert_unsupported(self, obj):
10+
if callable(obj):
11+
# Queryset wrapped in a function (for aggregates and such)
12+
self.assertRaises(UnsupportedDatabaseOperation, obj)
13+
else:
14+
# Just a queryset that blows up on evaluation
15+
self.assertRaises(UnsupportedDatabaseOperation, list, obj)
16+
917
def test_create(self):
1018
b = Artist.objects.create(name="Bruce Springsteen", good=True)
1119
self.assertTrue(b.pk is not None)
@@ -359,15 +367,7 @@ def test_close(self):
359367
# Ensure that closing a connection that was never established doesn't
360368
# blow up.
361369
connection.close()
362-
363-
def assert_unsupported(self, obj):
364-
if callable(obj):
365-
# Queryset wrapped in a function (for aggregates and such)
366-
self.assertRaises(UnsupportedDatabaseOperation, obj)
367-
else:
368-
# Just a queryset that blows up on evaluation
369-
self.assertRaises(UnsupportedDatabaseOperation, list, obj)
370-
370+
371371
def test_unsupported_ops(self):
372372
self.assert_unsupported(
373373
Artist.objects.filter(current_group__name="The Beatles")
@@ -396,3 +396,55 @@ def test_unsupported_ops(self):
396396
self.assert_unsupported(
397397
Artist.objects.filter(Q(pk=0) | Q(pk=1))
398398
)
399+
400+
def test_list_field(self):
401+
p = Post.objects.create(
402+
title="Django ORM grows MongoDB support",
403+
tags=["python", "django", "mongodb", "web"]
404+
)
405+
406+
self.assertEqual(p.tags, ["python", "django", "mongodb", "web"])
407+
408+
p = Post.objects.get(pk=p.pk)
409+
self.assertEqual(p.tags, ["python", "django", "mongodb", "web"])
410+
411+
p = Post.objects.create(
412+
title="Rails 3.0 Released",
413+
tags=["ruby", "rails", "release", "web"],
414+
)
415+
416+
self.assertQuerysetEqual(
417+
Post.objects.filter(tags="web"), [
418+
"Django ORM grows MongoDB support",
419+
"Rails 3.0 Released",
420+
],
421+
lambda p: p.title,
422+
)
423+
424+
self.assertQuerysetEqual(
425+
Post.objects.filter(tags="python"), [
426+
"Django ORM grows MongoDB support",
427+
],
428+
lambda p: p.title
429+
)
430+
431+
self.assertRaises(ValueError,
432+
lambda: Post.objects.create(magic_numbers=["a"])
433+
)
434+
435+
p = Post.objects.create(
436+
title="Simon the Wizard",
437+
magic_numbers=["42"]
438+
)
439+
self.assertQuerysetEqual(
440+
Post.objects.filter(magic_numbers=42), [
441+
"Simon the Wizard",
442+
],
443+
lambda p: p.title,
444+
)
445+
self.assertQuerysetEqual(
446+
Post.objects.filter(magic_numbers="42"), [
447+
"Simon the Wizard",
448+
],
449+
lambda p: p.title,
450+
)

0 commit comments

Comments
 (0)