Commits

Anonymous committed 1abbea1

[soc2010/query-refactor] Added a ListField, currently only works on MongoDB.

Comments (0)

Files changed (3)

django/db/models/__init__.py

 from django.conf import settings
 from django.core.exceptions import ObjectDoesNotExist, ImproperlyConfigured
 from django.db import connection
-from django.db.models.loading import get_apps, get_app, get_models, get_model, register_models
+from django.db.models.loading import (get_apps, get_app, get_models, get_model,
+    register_models)
 from django.db.models.query import Q
 from django.db.models.expressions import F
 from django.db.models.manager import Manager
 from django.db.models.fields import *
 from django.db.models.fields.subclassing import SubfieldBase
 from django.db.models.fields.files import FileField, ImageField
-from django.db.models.fields.related import ForeignKey, OneToOneField, ManyToManyField, ManyToOneRel, ManyToManyRel, OneToOneRel
+from django.db.models.fields.related import (ForeignKey, OneToOneField,
+    ManyToManyField, ManyToOneRel, ManyToManyRel, OneToOneRel)
+from django.db.models.fields.structures import ListField
 from django.db.models import signals
 
 # Admin stages.

tests/regressiontests/mongodb/models.py

     name = models.CharField(max_length=255)
     year_formed = models.IntegerField(null=True)
 
+
+class Post(models.Model):
+    id = models.NativeAutoField(primary_key=True)
+    title = models.CharField(max_length=255)
+    
+    tags = models.ListField(
+        models.CharField(max_length=255)
+    )
+    
+    magic_numbers = models.ListField(
+        models.IntegerField()
+    )

tests/regressiontests/mongodb/tests.py

 from django.db.models import Count, Sum, F, Q
 from django.test import TestCase
 
-from models import Artist, Group
+from models import Artist, Group, Post
 
 
 class MongoTestCase(TestCase):
+    def assert_unsupported(self, obj):
+        if callable(obj):
+            # Queryset wrapped in a function (for aggregates and such)
+            self.assertRaises(UnsupportedDatabaseOperation, obj)
+        else:
+            # Just a queryset that blows up on evaluation
+            self.assertRaises(UnsupportedDatabaseOperation, list, obj)
+
     def test_create(self):
         b = Artist.objects.create(name="Bruce Springsteen", good=True)
         self.assertTrue(b.pk is not None)
         # Ensure that closing a connection that was never established doesn't
         # blow up.
         connection.close()
-    
-    def assert_unsupported(self, obj):
-        if callable(obj):
-            # Queryset wrapped in a function (for aggregates and such)
-            self.assertRaises(UnsupportedDatabaseOperation, obj)
-        else:
-            # Just a queryset that blows up on evaluation
-            self.assertRaises(UnsupportedDatabaseOperation, list, obj)
-    
+
     def test_unsupported_ops(self):
         self.assert_unsupported(
             Artist.objects.filter(current_group__name="The Beatles")
         self.assert_unsupported(
             Artist.objects.filter(Q(pk=0) | Q(pk=1))
         )
+    
+    def test_list_field(self):
+        p = Post.objects.create(
+            title="Django ORM grows MongoDB support",
+            tags=["python", "django", "mongodb", "web"]
+        )
+        
+        self.assertEqual(p.tags, ["python", "django", "mongodb", "web"])
+        
+        p = Post.objects.get(pk=p.pk)
+        self.assertEqual(p.tags, ["python", "django", "mongodb", "web"])
+        
+        p = Post.objects.create(
+            title="Rails 3.0 Released",
+            tags=["ruby", "rails", "release", "web"],
+        )
+        
+        self.assertQuerysetEqual(
+            Post.objects.filter(tags="web"), [
+                "Django ORM grows MongoDB support",
+                "Rails 3.0 Released",
+            ],
+            lambda p: p.title,
+        )
+        
+        self.assertQuerysetEqual(
+            Post.objects.filter(tags="python"), [
+                "Django ORM grows MongoDB support",
+            ],
+            lambda p: p.title
+        )
+        
+        self.assertRaises(ValueError,
+            lambda: Post.objects.create(magic_numbers=["a"])
+        )
+        
+        p = Post.objects.create(
+            title="Simon the Wizard",
+            magic_numbers=["42"]
+        )
+        self.assertQuerysetEqual(
+            Post.objects.filter(magic_numbers=42), [
+                "Simon the Wizard",
+            ],
+            lambda p: p.title,
+        )
+        self.assertQuerysetEqual(
+            Post.objects.filter(magic_numbers="42"), [
+                "Simon the Wizard",
+            ],
+            lambda p: p.title,
+        )