mirror of
				https://github.com/django/django.git
				synced 2025-11-04 01:47:52 +03:00 
			
		
		
		
	Fixed #11107 -- Corrected the generation of sequence reset SQL for m2m 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
This commit is contained in:
		
							parent
							
								
									55968a6edd
								
							
						
					
					
						commit
						52bc782621
					
				
							
								
								
									
										1
									
								
								AUTHORS
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								AUTHORS
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -217,12 +217,13 @@ WHEN (new.%(col_name)s IS NULL)
 | 
			
		|||
                    # 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):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -121,14 +121,15 @@ class DatabaseOperations(BaseDatabaseOperations):
 | 
			
		|||
                        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):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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"
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
]
 | 
			
		||||
| 
						 | 
				
			
			@ -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 @@ doing a join.
 | 
			
		|||
# 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"}}]
 | 
			
		||||
 | 
			
		||||
"""}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user