mirror of
https://github.com/django/django.git
synced 2025-07-19 09:09:13 +00:00
[1.0.X] Fixed insert/update handling when no database interaction is required.
Fixed #10205 as part of this. Backport of r9926 from trunk. git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@9927 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
283c89e4c6
commit
016f12a2c2
@ -1743,9 +1743,11 @@ class BaseQuery(object):
|
|||||||
iterator over the results if the result_type is MULTI.
|
iterator over the results if the result_type is MULTI.
|
||||||
|
|
||||||
result_type is either MULTI (use fetchmany() to retrieve all rows),
|
result_type is either MULTI (use fetchmany() to retrieve all rows),
|
||||||
SINGLE (only retrieve a single row), or None (no results expected, but
|
SINGLE (only retrieve a single row), or None. In this last case, the
|
||||||
the cursor is returned, since it's used by subclasses such as
|
cursor is returned if any query is executed, since it's used by
|
||||||
InsertQuery).
|
subclasses such as InsertQuery). It's possible, however, that no query
|
||||||
|
is needed, as the filters describe an empty set. In that case, None is
|
||||||
|
returned, to avoid any unnecessary database interaction.
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
sql, params = self.as_sql()
|
sql, params = self.as_sql()
|
||||||
|
@ -115,7 +115,7 @@ class UpdateQuery(Query):
|
|||||||
tables, but their rowcounts are not returned).
|
tables, but their rowcounts are not returned).
|
||||||
"""
|
"""
|
||||||
cursor = super(UpdateQuery, self).execute_sql(result_type)
|
cursor = super(UpdateQuery, self).execute_sql(result_type)
|
||||||
rows = cursor.rowcount
|
rows = cursor and cursor.rowcount or 0
|
||||||
del cursor
|
del cursor
|
||||||
for query in self.get_related_updates():
|
for query in self.get_related_updates():
|
||||||
query.execute_sql(result_type)
|
query.execute_sql(result_type)
|
||||||
@ -307,7 +307,7 @@ class InsertQuery(Query):
|
|||||||
|
|
||||||
def execute_sql(self, return_id=False):
|
def execute_sql(self, return_id=False):
|
||||||
cursor = super(InsertQuery, self).execute_sql(None)
|
cursor = super(InsertQuery, self).execute_sql(None)
|
||||||
if return_id:
|
if return_id and cursor:
|
||||||
return self.connection.ops.last_insert_id(cursor,
|
return self.connection.ops.last_insert_id(cursor,
|
||||||
self.model._meta.db_table, self.model._meta.pk.column)
|
self.model._meta.db_table, self.model._meta.pk.column)
|
||||||
|
|
||||||
|
@ -1056,6 +1056,20 @@ cases).
|
|||||||
Bug #9985 -- qs.values_list(...).values(...) combinations should work.
|
Bug #9985 -- qs.values_list(...).values(...) combinations should work.
|
||||||
>>> Note.objects.values_list("note", flat=True).values("id").order_by("id")
|
>>> Note.objects.values_list("note", flat=True).values("id").order_by("id")
|
||||||
[{'id': 1}, {'id': 2}, {'id': 3}]
|
[{'id': 1}, {'id': 2}, {'id': 3}]
|
||||||
|
>>> Annotation.objects.filter(notes__in=Note.objects.filter(note="n1").values_list('note').values('id'))
|
||||||
|
[<Annotation: a1>]
|
||||||
|
|
||||||
|
Bug #10028 -- ordering by model related to nullable relations(!) should use
|
||||||
|
outer joins, so that all results are included.
|
||||||
|
>>> _ = Plaything.objects.create(name="p1")
|
||||||
|
>>> Plaything.objects.all()
|
||||||
|
[<Plaything: p1>]
|
||||||
|
|
||||||
|
Bug #10205 -- When bailing out early because of an empty "__in" filter, we need
|
||||||
|
to set things up correctly internally so that subqueries can continue properly.
|
||||||
|
>>> Tag.objects.filter(name__in=()).update(name="foo")
|
||||||
|
0
|
||||||
|
|
||||||
"""}
|
"""}
|
||||||
|
|
||||||
# In Python 2.3 and the Python 2.6 beta releases, exceptions raised in __len__
|
# In Python 2.3 and the Python 2.6 beta releases, exceptions raised in __len__
|
||||||
|
Loading…
x
Reference in New Issue
Block a user