Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fixed #11107 -- Corrected the generation of sequence reset SQL for m2…

…m fields with an intermediate model. Thanks to J Clifford Dyer for the report and fix.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@11215 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 52bc78262172ad6e8deb3c75bd65edea68924dbc 1 parent 55968a6
Russell Keith-Magee freakboy3742 authored
1  AUTHORS
View
@@ -131,6 +131,7 @@ answer newbie questions, and generally made Django that much better:
Andrew Durdin <adurdin@gmail.com>
dusk@woofle.net
Andy Dustman <farcepest@gmail.com>
+ J. Clifford Dyer <jcd@unc.edu>
Clint Ecker
Nick Efford <nick@efford.org>
eibaan@gmail.com
13 django/db/backends/oracle/base.py
View
@@ -217,12 +217,13 @@ def sequence_reset_sql(self, style, model_list):
# continue to loop
break
for f in model._meta.many_to_many:
- table_name = self.quote_name(f.m2m_db_table())
- sequence_name = get_sequence_name(f.m2m_db_table())
- column_name = self.quote_name('id')
- output.append(query % {'sequence': sequence_name,
- 'table': table_name,
- 'column': column_name})
+ if not f.rel.through:
+ table_name = self.quote_name(f.m2m_db_table())
+ sequence_name = get_sequence_name(f.m2m_db_table())
+ column_name = self.quote_name('id')
+ output.append(query % {'sequence': sequence_name,
+ 'table': table_name,
+ 'column': column_name})
return output
def start_transaction_sql(self):
17 django/db/backends/postgresql/operations.py
View
@@ -121,14 +121,15 @@ def sequence_reset_sql(self, style, model_list):
style.SQL_TABLE(qn(model._meta.db_table))))
break # Only one AutoField is allowed per model, so don't bother continuing.
for f in model._meta.many_to_many:
- output.append("%s setval('%s', coalesce(max(%s), 1), max(%s) %s null) %s %s;" % \
- (style.SQL_KEYWORD('SELECT'),
- style.SQL_FIELD(qn('%s_id_seq' % f.m2m_db_table())),
- style.SQL_FIELD(qn('id')),
- style.SQL_FIELD(qn('id')),
- style.SQL_KEYWORD('IS NOT'),
- style.SQL_KEYWORD('FROM'),
- style.SQL_TABLE(qn(f.m2m_db_table()))))
+ if not f.rel.through:
+ output.append("%s setval('%s', coalesce(max(%s), 1), max(%s) %s null) %s %s;" % \
+ (style.SQL_KEYWORD('SELECT'),
+ style.SQL_FIELD(qn('%s_id_seq' % f.m2m_db_table())),
+ style.SQL_FIELD(qn('id')),
+ style.SQL_FIELD(qn('id')),
+ style.SQL_KEYWORD('IS NOT'),
+ style.SQL_KEYWORD('FROM'),
+ style.SQL_TABLE(qn(f.m2m_db_table()))))
return output
def savepoint_create_sql(self, sid):
34 tests/regressiontests/m2m_through_regress/fixtures/m2m_through.json
View
@@ -0,0 +1,34 @@
+[
+ {
+ "pk": "1",
+ "model": "m2m_through_regress.person",
+ "fields": {
+ "name": "Guido"
+ }
+ },
+ {
+ "pk": "1",
+ "model": "auth.user",
+ "fields": {
+ "username": "Guido",
+ "email": "bdfl@python.org",
+ "password": "abcde"
+ }
+ },
+ {
+ "pk": "1",
+ "model": "m2m_through_regress.group",
+ "fields": {
+ "name": "Python Core Group"
+ }
+ },
+ {
+ "pk": "1",
+ "model": "m2m_through_regress.usermembership",
+ "fields": {
+ "user": "1",
+ "group": "1",
+ "price": "100"
+ }
+ }
+]
10 tests/regressiontests/m2m_through_regress/models.py
View
@@ -12,7 +12,9 @@ class Membership(models.Model):
def __unicode__(self):
return "%s is a member of %s" % (self.person.name, self.group.name)
+# using custom id column to test ticket #11107
class UserMembership(models.Model):
+ id = models.AutoField(db_column='usermembership_id', primary_key=True)
user = models.ForeignKey(User)
group = models.ForeignKey('Group')
price = models.IntegerField(default=100)
@@ -196,4 +198,12 @@ class B(models.Model):
# Flush the database, just to make sure we can.
>>> management.call_command('flush', verbosity=0, interactive=False)
+## Regression test for #11107
+Ensure that sequences on m2m_through tables are being created for the through
+model, not for a phantom auto-generated m2m table.
+
+>>> management.call_command('loaddata', 'm2m_through', verbosity=0)
+>>> management.call_command('dumpdata', 'm2m_through_regress', format='json')
+[{"pk": 1, "model": "m2m_through_regress.usermembership", "fields": {"price": 100, "group": 1, "user": 1}}, {"pk": 1, "model": "m2m_through_regress.person", "fields": {"name": "Guido"}}, {"pk": 1, "model": "m2m_through_regress.group", "fields": {"name": "Python Core Group"}}]
+
"""}
Please sign in to comment.
Something went wrong with that request. Please try again.