diff -ur ../orig/Django-1.5.5/django/db/backends/mysql/base.py django/db/backends/mysql/base.py
--- ../orig/Django-1.5.5/django/db/backends/mysql/base.py	2013-10-25 06:27:46.000000000 +0200
+++ django/db/backends/mysql/base.py	2014-01-29 14:17:51.000000000 +0100
@@ -339,10 +339,13 @@
 class DatabaseWrapper(BaseDatabaseWrapper):
     vendor = 'mysql'
     operators = {
+        'ne': '<> %s',
         'exact': '= %s',
         'iexact': 'LIKE %s',
         'contains': 'LIKE BINARY %s',
         'icontains': 'LIKE %s',
+        'ncontains': 'NOT LIKE BINARY %s',
+        'nicontains': 'NOT LIKE %s',
         'regex': 'REGEXP BINARY %s',
         'iregex': 'REGEXP %s',
         'gt': '> %s',
diff -ur ../orig/Django-1.5.5/django/db/backends/oracle/base.py django/db/backends/oracle/base.py
--- ../orig/Django-1.5.5/django/db/backends/oracle/base.py	2013-10-25 06:27:46.000000000 +0200
+++ django/db/backends/oracle/base.py	2014-01-29 13:55:25.000000000 +0100
@@ -431,6 +431,7 @@
     operators = _UninitializedOperatorsDescriptor()
 
     _standard_operators = {
+        'ne': '<> %s',
         'exact': '= %s',
         'iexact': '= UPPER(%s)',
         'contains': "LIKE TRANSLATE(%s USING NCHAR_CS) ESCAPE TRANSLATE('\\' USING NCHAR_CS)",
diff -ur ../orig/Django-1.5.5/django/db/backends/postgresql_psycopg2/base.py django/db/backends/postgresql_psycopg2/base.py
--- ../orig/Django-1.5.5/django/db/backends/postgresql_psycopg2/base.py	2013-10-25 06:27:46.000000000 +0200
+++ django/db/backends/postgresql_psycopg2/base.py	2014-01-29 13:55:25.000000000 +0100
@@ -90,6 +90,7 @@
 class DatabaseWrapper(BaseDatabaseWrapper):
     vendor = 'postgresql'
     operators = {
+        'ne': '<> %s',
         'exact': '= %s',
         'iexact': '= UPPER(%s)',
         'contains': 'LIKE %s',
diff -ur ../orig/Django-1.5.5/django/db/backends/sqlite3/base.py django/db/backends/sqlite3/base.py
--- ../orig/Django-1.5.5/django/db/backends/sqlite3/base.py	2013-10-25 06:27:46.000000000 +0200
+++ django/db/backends/sqlite3/base.py	2014-01-29 15:00:28.000000000 +0100
@@ -240,10 +240,13 @@
     # being escaped has a percent or underscore in it.
     # See http://www.sqlite.org/lang_expr.html for an explanation.
     operators = {
+        'ne': '<> %s',
         'exact': '= %s',
         'iexact': "LIKE %s ESCAPE '\\'",
         'contains': "LIKE %s ESCAPE '\\'",
         'icontains': "LIKE %s ESCAPE '\\'",
+        'ncontains': "NOT LIKE %s ESCAPE '\\'",
+        'nicontains': "NOT LIKE %s ESCAPE '\\'",
         'regex': 'REGEXP %s',
         'iregex': "REGEXP '(?i)' || %s",
         'gt': '> %s',
diff -ur ../orig/Django-1.5.5/django/db/models/fields/__init__.py django/db/models/fields/__init__.py
--- ../orig/Django-1.5.5/django/db/models/fields/__init__.py	2013-10-25 06:27:46.000000000 +0200
+++ django/db/models/fields/__init__.py	2014-01-29 14:35:52.000000000 +0100
@@ -315,12 +315,13 @@
         if lookup_type in (
                 'regex', 'iregex', 'month', 'day', 'week_day', 'search',
                 'contains', 'icontains', 'iexact', 'startswith', 'istartswith',
-                'endswith', 'iendswith', 'isnull'
+                'endswith', 'iendswith', 'isnull',
+                'ncontains', 'nicontains'
             ):
             return value
-        elif lookup_type in ('exact', 'gt', 'gte', 'lt', 'lte'):
+        elif lookup_type in ('exact', 'ne', 'gt', 'gte', 'lt', 'lte'):
             return self.get_prep_value(value)
-        elif lookup_type in ('range', 'in'):
+        elif lookup_type in ('range', 'in', 'notin'):
             return [self.get_prep_value(v) for v in value]
         elif lookup_type == 'year':
             try:
@@ -354,13 +355,13 @@
         if lookup_type in ('regex', 'iregex', 'month', 'day', 'week_day',
                            'search'):
             return [value]
-        elif lookup_type in ('exact', 'gt', 'gte', 'lt', 'lte'):
+        elif lookup_type in ('exact', 'ne', 'gt', 'gte', 'lt', 'lte'):
             return [self.get_db_prep_value(value, connection=connection,
                                            prepared=prepared)]
-        elif lookup_type in ('range', 'in'):
+        elif lookup_type in ('range', 'in', 'notin'):
             return [self.get_db_prep_value(v, connection=connection,
                                            prepared=prepared) for v in value]
-        elif lookup_type in ('contains', 'icontains'):
+        elif lookup_type in ('contains', 'icontains', 'ncontains', 'nicontains'):
             return ["%%%s%%" % connection.ops.prep_for_like_query(value)]
         elif lookup_type == 'iexact':
             return [connection.ops.prep_for_iexact_query(value)]
diff -ur ../orig/Django-1.5.5/django/db/models/fields/related.py django/db/models/fields/related.py
--- ../orig/Django-1.5.5/django/db/models/fields/related.py	2013-10-25 06:27:46.000000000 +0200
+++ django/db/models/fields/related.py	2014-01-29 13:55:25.000000000 +0100
@@ -139,9 +139,9 @@
         # get_(next/prev)_by_date work; other lookups are not allowed since that
         # gets messy pretty quick. This is a good candidate for some refactoring
         # in the future.
-        if lookup_type in ['exact', 'gt', 'lt', 'gte', 'lte']:
+        if lookup_type in ['exact', 'ne', 'gt', 'lt', 'gte', 'lte']:
             return self._pk_trace(value, 'get_prep_lookup', lookup_type)
-        if lookup_type in ('range', 'in'):
+        if lookup_type in ('range', 'in', 'notin'):
             return [self._pk_trace(v, 'get_prep_lookup', lookup_type) for v in value]
         elif lookup_type == 'isnull':
             return []
@@ -167,10 +167,10 @@
         # get_(next/prev)_by_date work; other lookups are not allowed since that
         # gets messy pretty quick. This is a good candidate for some refactoring
         # in the future.
-        if lookup_type in ['exact', 'gt', 'lt', 'gte', 'lte']:
+        if lookup_type in ['exact', 'ne', 'gt', 'lt', 'gte', 'lte']:
             return [self._pk_trace(value, 'get_db_prep_lookup', lookup_type,
                             connection=connection, prepared=prepared)]
-        if lookup_type in ('range', 'in'):
+        if lookup_type in ('range', 'in', 'notin'):
             return [self._pk_trace(v, 'get_db_prep_lookup', lookup_type,
                             connection=connection, prepared=prepared)
                     for v in value]
@@ -211,7 +211,7 @@
             else:
                 field = field.rel.to._meta.pk
 
-        if lookup_type in ('range', 'in'):
+        if lookup_type in ('range', 'in', 'notin'):
             v = [v]
         v = getattr(field, prep_func)(lookup_type, v, **kwargs)
         if isinstance(v, list):
diff -ur ../orig/Django-1.5.5/django/db/models/sql/constants.py django/db/models/sql/constants.py
--- ../orig/Django-1.5.5/django/db/models/sql/constants.py	2013-10-25 06:27:46.000000000 +0200
+++ django/db/models/sql/constants.py	2014-01-29 14:17:47.000000000 +0100
@@ -12,6 +12,7 @@
     'exact', 'iexact', 'contains', 'icontains', 'gt', 'gte', 'lt', 'lte', 'in',
     'startswith', 'istartswith', 'endswith', 'iendswith', 'range', 'year',
     'month', 'day', 'week_day', 'isnull', 'search', 'regex', 'iregex',
+    'ne', 'notin', 'ncontains', 'nicontains',
 ])
 
 # Size of each "chunk" for get_iterator calls.
diff -ur ../orig/Django-1.5.5/django/db/models/sql/query.py django/db/models/sql/query.py
--- ../orig/Django-1.5.5/django/db/models/sql/query.py	2013-10-25 06:27:46.000000000 +0200
+++ django/db/models/sql/query.py	2014-01-29 13:55:25.000000000 +0100
@@ -1101,10 +1101,10 @@
         # Interpret '__exact=None' as the sql 'is NULL'; otherwise, reject all
         # uses of None as a query value.
         if value is None:
-            if lookup_type != 'exact':
+            if lookup_type not in ('exact', 'ne'):
                 raise ValueError("Cannot use None as a query value")
+            value = lookup_type == 'exact'
             lookup_type = 'isnull'
-            value = True
         elif callable(value):
             value = value()
         elif isinstance(value, ExpressionNode):
diff -ur ../orig/Django-1.5.5/django/db/models/sql/where.py django/db/models/sql/where.py
--- ../orig/Django-1.5.5/django/db/models/sql/where.py	2013-10-25 06:27:46.000000000 +0200
+++ django/db/models/sql/where.py	2014-01-29 14:11:51.000000000 +0100
@@ -185,10 +185,10 @@
         else:
             extra = ''
 
-        if (len(params) == 1 and params[0] == '' and lookup_type == 'exact'
+        if (len(params) == 1 and params[0] == '' and lookup_type in ('exact', 'ne')
             and connection.features.interprets_empty_strings_as_nulls):
+            value_annotation = lookup_type == 'exact'
             lookup_type = 'isnull'
-            value_annotation = True
 
         if lookup_type in connection.operators:
             format = "%s %%s %%s" % (connection.ops.lookup_cast(lookup_type),)
@@ -196,11 +196,15 @@
                               connection.operators[lookup_type] % cast_sql,
                               extra), params)
 
-        if lookup_type == 'in':
+        if lookup_type in ('in', 'notin'):
             if not value_annotation:
                 raise EmptyResultSet
+            if lookup_type == 'in':
+                op = 'IN'
+            else:
+                op = 'NOT IN'
             if extra:
-                return ('%s IN %s' % (field_sql, extra), params)
+                return ('%s %s %s' % (field_sql, op, extra), params)
             max_in_list_size = connection.ops.max_in_list_size()
             if max_in_list_size and len(params) > max_in_list_size:
                 # Break up the params list into an OR of manageable chunks.
@@ -208,7 +212,7 @@
                 for offset in xrange(0, len(params), max_in_list_size):
                     if offset > 0:
                         in_clause_elements.append(' OR ')
-                    in_clause_elements.append('%s IN (' % field_sql)
+                    in_clause_elements.append('%s %s (' % (field_sql, op))
                     group_size = min(len(params) - offset, max_in_list_size)
                     param_group = ', '.join(repeat('%s', group_size))
                     in_clause_elements.append(param_group)
@@ -216,7 +220,7 @@
                 in_clause_elements.append(')')
                 return ''.join(in_clause_elements), params
             else:
-                return ('%s IN (%s)' % (field_sql,
+                return ('%s %s (%s)' % (field_sql, op,
                                         ', '.join(repeat('%s', len(params)))),
                         params)
         elif lookup_type in ('range', 'year'):
