|
@@ -195,7 +195,9 @@ AND whose ``headline`` is "Hello"::
|
|
|
|
|
|
Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3), headline='Hello')
|
|
|
|
|
|
-In SQL terms, that evaluates to::
|
|
|
+In SQL terms, that evaluates to:
|
|
|
+
|
|
|
+.. code-block:: sql
|
|
|
|
|
|
SELECT ...
|
|
|
WHERE NOT (pub_date > '2005-1-3' AND headline = 'Hello')
|
|
@@ -205,7 +207,9 @@ OR whose headline is "Hello"::
|
|
|
|
|
|
Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3)).exclude(headline='Hello')
|
|
|
|
|
|
-In SQL terms, that evaluates to::
|
|
|
+In SQL terms, that evaluates to:
|
|
|
+
|
|
|
+.. code-block:: sql
|
|
|
|
|
|
SELECT ...
|
|
|
WHERE NOT pub_date > '2005-1-3'
|
|
@@ -1308,9 +1312,11 @@ generated by a ``QuerySet``.
|
|
|
``params`` in order to protect against SQL injection attacks.
|
|
|
|
|
|
You also must not quote placeholders in the SQL string. This example is
|
|
|
- vulnerable to SQL injection because of the quotes around ``%s``::
|
|
|
+ vulnerable to SQL injection because of the quotes around ``%s``:
|
|
|
+
|
|
|
+ .. code-block:: sql
|
|
|
|
|
|
- "select col from sometable where othercol = '%s'" # unsafe!
|
|
|
+ SELECT col FROM sometable WHERE othercol = '%s' # unsafe!
|
|
|
|
|
|
You can read more about how Django's :ref:`SQL injection protection
|
|
|
<sql-injection-protection>` works.
|
|
@@ -1337,8 +1343,9 @@ of the arguments is required, but you should use at least one of them.
|
|
|
is greater than Jan. 1, 2006.
|
|
|
|
|
|
Django inserts the given SQL snippet directly into the ``SELECT``
|
|
|
- statement, so the resulting SQL of the above example would be something
|
|
|
- like::
|
|
|
+ statement, so the resulting SQL of the above example would be something like:
|
|
|
+
|
|
|
+ .. code-block:: sql
|
|
|
|
|
|
SELECT blog_entry.*, (pub_date > '2006-01-01') AS is_recent
|
|
|
FROM blog_entry;
|
|
@@ -1357,7 +1364,9 @@ of the arguments is required, but you should use at least one of them.
|
|
|
In this particular case, we're exploiting the fact that the query will
|
|
|
already contain the ``blog_blog`` table in its ``FROM`` clause.
|
|
|
|
|
|
- The resulting SQL of the above example would be::
|
|
|
+ The resulting SQL of the above example would be:
|
|
|
+
|
|
|
+ .. code-block:: sql
|
|
|
|
|
|
SELECT blog_blog.*, (SELECT COUNT(*) FROM blog_entry WHERE blog_entry.blog_id = blog_blog.id) AS entry_count
|
|
|
FROM blog_blog;
|
|
@@ -1394,7 +1403,9 @@ of the arguments is required, but you should use at least one of them.
|
|
|
|
|
|
Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
|
|
|
|
|
|
- ...translates (roughly) into the following SQL::
|
|
|
+ ...translates (roughly) into the following SQL:
|
|
|
+
|
|
|
+ .. code-block:: sql
|
|
|
|
|
|
SELECT * FROM blog_entry WHERE (foo='a' OR bar='a') AND (baz='a')
|
|
|
|
|
@@ -2622,7 +2633,9 @@ Examples::
|
|
|
Entry.objects.get(id__exact=14)
|
|
|
Entry.objects.get(id__exact=None)
|
|
|
|
|
|
-SQL equivalents::
|
|
|
+SQL equivalents:
|
|
|
+
|
|
|
+.. code-block:: sql
|
|
|
|
|
|
SELECT ... WHERE id = 14;
|
|
|
SELECT ... WHERE id IS NULL;
|
|
@@ -2650,7 +2663,9 @@ Example::
|
|
|
Blog.objects.get(name__iexact='beatles blog')
|
|
|
Blog.objects.get(name__iexact=None)
|
|
|
|
|
|
-SQL equivalents::
|
|
|
+SQL equivalents:
|
|
|
+
|
|
|
+.. code-block:: sql
|
|
|
|
|
|
SELECT ... WHERE name ILIKE 'beatles blog';
|
|
|
SELECT ... WHERE name IS NULL;
|
|
@@ -2675,7 +2690,9 @@ Example::
|
|
|
|
|
|
Entry.objects.get(headline__contains='Lennon')
|
|
|
|
|
|
-SQL equivalent::
|
|
|
+SQL equivalent:
|
|
|
+
|
|
|
+.. code-block:: sql
|
|
|
|
|
|
SELECT ... WHERE headline LIKE '%Lennon%';
|
|
|
|
|
@@ -2700,7 +2717,9 @@ Example::
|
|
|
|
|
|
Entry.objects.get(headline__icontains='Lennon')
|
|
|
|
|
|
-SQL equivalent::
|
|
|
+SQL equivalent:
|
|
|
+
|
|
|
+.. code-block:: sql
|
|
|
|
|
|
SELECT ... WHERE headline ILIKE '%Lennon%';
|
|
|
|
|
@@ -2722,7 +2741,9 @@ Examples::
|
|
|
Entry.objects.filter(id__in=[1, 3, 4])
|
|
|
Entry.objects.filter(headline__in='abc')
|
|
|
|
|
|
-SQL equivalents::
|
|
|
+SQL equivalents:
|
|
|
+
|
|
|
+.. code-block:: sql
|
|
|
|
|
|
SELECT ... WHERE id IN (1, 3, 4);
|
|
|
SELECT ... WHERE headline IN ('a', 'b', 'c');
|
|
@@ -2733,7 +2754,9 @@ instead of providing a list of literal values::
|
|
|
inner_qs = Blog.objects.filter(name__contains='Cheddar')
|
|
|
entries = Entry.objects.filter(blog__in=inner_qs)
|
|
|
|
|
|
-This queryset will be evaluated as subselect statement::
|
|
|
+This queryset will be evaluated as subselect statement:
|
|
|
+
|
|
|
+.. code-block:: sql
|
|
|
|
|
|
SELECT ... WHERE blog.id IN (SELECT id FROM ... WHERE NAME LIKE '%Cheddar%')
|
|
|
|
|
@@ -2782,7 +2805,9 @@ Example::
|
|
|
|
|
|
Entry.objects.filter(id__gt=4)
|
|
|
|
|
|
-SQL equivalent::
|
|
|
+SQL equivalent:
|
|
|
+
|
|
|
+.. code-block:: sql
|
|
|
|
|
|
SELECT ... WHERE id > 4;
|
|
|
|
|
@@ -2818,7 +2843,9 @@ Example::
|
|
|
|
|
|
Entry.objects.filter(headline__startswith='Lennon')
|
|
|
|
|
|
-SQL equivalent::
|
|
|
+SQL equivalent:
|
|
|
+
|
|
|
+.. code-block:: sql
|
|
|
|
|
|
SELECT ... WHERE headline LIKE 'Lennon%';
|
|
|
|
|
@@ -2836,7 +2863,9 @@ Example::
|
|
|
|
|
|
Entry.objects.filter(headline__istartswith='Lennon')
|
|
|
|
|
|
-SQL equivalent::
|
|
|
+SQL equivalent:
|
|
|
+
|
|
|
+.. code-block:: sql
|
|
|
|
|
|
SELECT ... WHERE headline ILIKE 'Lennon%';
|
|
|
|
|
@@ -2856,7 +2885,9 @@ Example::
|
|
|
|
|
|
Entry.objects.filter(headline__endswith='Lennon')
|
|
|
|
|
|
-SQL equivalent::
|
|
|
+SQL equivalent:
|
|
|
+
|
|
|
+.. code-block:: sql
|
|
|
|
|
|
SELECT ... WHERE headline LIKE '%Lennon';
|
|
|
|
|
@@ -2877,7 +2908,9 @@ Example::
|
|
|
|
|
|
Entry.objects.filter(headline__iendswith='Lennon')
|
|
|
|
|
|
-SQL equivalent::
|
|
|
+SQL equivalent:
|
|
|
+
|
|
|
+.. code-block:: sql
|
|
|
|
|
|
SELECT ... WHERE headline ILIKE '%Lennon'
|
|
|
|
|
@@ -2900,7 +2933,9 @@ Example::
|
|
|
end_date = datetime.date(2005, 3, 31)
|
|
|
Entry.objects.filter(pub_date__range=(start_date, end_date))
|
|
|
|
|
|
-SQL equivalent::
|
|
|
+SQL equivalent:
|
|
|
+
|
|
|
+.. code-block:: sql
|
|
|
|
|
|
SELECT ... WHERE pub_date BETWEEN '2005-01-01' and '2005-03-31';
|
|
|
|
|
@@ -2912,7 +2947,9 @@ numbers and even characters.
|
|
|
Filtering a ``DateTimeField`` with dates won't include items on the last
|
|
|
day, because the bounds are interpreted as "0am on the given date". If
|
|
|
``pub_date`` was a ``DateTimeField``, the above expression would be turned
|
|
|
- into this SQL::
|
|
|
+ into this SQL:
|
|
|
+
|
|
|
+ .. code-block:: sql
|
|
|
|
|
|
SELECT ... WHERE pub_date BETWEEN '2005-01-01 00:00:00' and '2005-03-31 00:00:00';
|
|
|
|
|
@@ -2950,7 +2987,9 @@ Example::
|
|
|
Entry.objects.filter(pub_date__year=2005)
|
|
|
Entry.objects.filter(pub_date__year__gte=2005)
|
|
|
|
|
|
-SQL equivalent::
|
|
|
+SQL equivalent:
|
|
|
+
|
|
|
+.. code-block:: sql
|
|
|
|
|
|
SELECT ... WHERE pub_date BETWEEN '2005-01-01' AND '2005-12-31';
|
|
|
SELECT ... WHERE pub_date >= '2005-01-01';
|
|
@@ -2993,7 +3032,9 @@ Example::
|
|
|
Entry.objects.filter(pub_date__month=12)
|
|
|
Entry.objects.filter(pub_date__month__gte=6)
|
|
|
|
|
|
-SQL equivalent::
|
|
|
+SQL equivalent:
|
|
|
+
|
|
|
+.. code-block:: sql
|
|
|
|
|
|
SELECT ... WHERE EXTRACT('month' FROM pub_date) = '12';
|
|
|
SELECT ... WHERE EXTRACT('month' FROM pub_date) >= '6';
|
|
@@ -3017,7 +3058,9 @@ Example::
|
|
|
Entry.objects.filter(pub_date__day=3)
|
|
|
Entry.objects.filter(pub_date__day__gte=3)
|
|
|
|
|
|
-SQL equivalent::
|
|
|
+SQL equivalent:
|
|
|
+
|
|
|
+.. code-block:: sql
|
|
|
|
|
|
SELECT ... WHERE EXTRACT('day' FROM pub_date) = '3';
|
|
|
SELECT ... WHERE EXTRACT('day' FROM pub_date) >= '3';
|
|
@@ -3131,7 +3174,9 @@ Example::
|
|
|
Event.objects.filter(time__hour=5)
|
|
|
Event.objects.filter(timestamp__hour__gte=12)
|
|
|
|
|
|
-SQL equivalent::
|
|
|
+SQL equivalent:
|
|
|
+
|
|
|
+.. code-block:: sql
|
|
|
|
|
|
SELECT ... WHERE EXTRACT('hour' FROM timestamp) = '23';
|
|
|
SELECT ... WHERE EXTRACT('hour' FROM time) = '5';
|
|
@@ -3156,7 +3201,9 @@ Example::
|
|
|
Event.objects.filter(time__minute=46)
|
|
|
Event.objects.filter(timestamp__minute__gte=29)
|
|
|
|
|
|
-SQL equivalent::
|
|
|
+SQL equivalent:
|
|
|
+
|
|
|
+.. code-block:: sql
|
|
|
|
|
|
SELECT ... WHERE EXTRACT('minute' FROM timestamp) = '29';
|
|
|
SELECT ... WHERE EXTRACT('minute' FROM time) = '46';
|
|
@@ -3181,7 +3228,9 @@ Example::
|
|
|
Event.objects.filter(time__second=2)
|
|
|
Event.objects.filter(timestamp__second__gte=31)
|
|
|
|
|
|
-SQL equivalent::
|
|
|
+SQL equivalent:
|
|
|
+
|
|
|
+.. code-block:: sql
|
|
|
|
|
|
SELECT ... WHERE EXTRACT('second' FROM timestamp) = '31';
|
|
|
SELECT ... WHERE EXTRACT('second' FROM time) = '2';
|
|
@@ -3204,7 +3253,9 @@ Example::
|
|
|
|
|
|
Entry.objects.filter(pub_date__isnull=True)
|
|
|
|
|
|
-SQL equivalent::
|
|
|
+SQL equivalent:
|
|
|
+
|
|
|
+.. code-block:: sql
|
|
|
|
|
|
SELECT ... WHERE pub_date IS NULL;
|
|
|
|
|
@@ -3224,7 +3275,9 @@ Example::
|
|
|
|
|
|
Entry.objects.get(title__regex=r'^(An?|The) +')
|
|
|
|
|
|
-SQL equivalents::
|
|
|
+SQL equivalents:
|
|
|
+
|
|
|
+.. code-block:: sql
|
|
|
|
|
|
SELECT ... WHERE title REGEXP BINARY '^(An?|The) +'; -- MySQL
|
|
|
|
|
@@ -3248,7 +3301,9 @@ Example::
|
|
|
|
|
|
Entry.objects.get(title__iregex=r'^(an?|the) +')
|
|
|
|
|
|
-SQL equivalents::
|
|
|
+SQL equivalents:
|
|
|
+
|
|
|
+.. code-block:: sql
|
|
|
|
|
|
SELECT ... WHERE title REGEXP '^(an?|the) +'; -- MySQL
|
|
|
|