1 | """Testing a problem with db/backends/postgresql/operations.py: sequence_reset_sql
|
---|
2 | That method gets called at the end of a loaddata and this part is a problem:
|
---|
3 |
|
---|
4 | for f in model._meta.many_to_many:
|
---|
5 | output.append("%s setval('%s', coalesce(max(%s), 1), max(%s) %s null) %s %s;" % \
|
---|
6 | (style.SQL_KEYWORD('SELECT'),
|
---|
7 | style.SQL_FIELD(qn('%s_id_seq' % f.m2m_db_table())),
|
---|
8 | style.SQL_FIELD(qn('id')),
|
---|
9 | style.SQL_FIELD(qn('id')),
|
---|
10 | style.SQL_KEYWORD('IS NOT'),
|
---|
11 | style.SQL_KEYWORD('FROM'),
|
---|
12 | style.SQL_TABLE(qn(f.m2m_db_table()))))
|
---|
13 |
|
---|
14 | If you have models with a M2M through that doesn't use integer
|
---|
15 | PK this code is still executed and that is an error.
|
---|
16 |
|
---|
17 | The following is self-contained, except that it uses the UUIDField from the
|
---|
18 | django_extensions project.
|
---|
19 |
|
---|
20 | I added 1 Book and 3 Authors and set-up the M2M relationship
|
---|
21 | between them. Then I issued the following commands:
|
---|
22 |
|
---|
23 | $ python manage.py dumpdata --format=json --indent=4 srtest > srtest_dump.json
|
---|
24 | $ python manage.py reset srtest
|
---|
25 | $ python manage.py loaddata srtest_dump.json
|
---|
26 |
|
---|
27 | Here is the output from the loaddata command:
|
---|
28 |
|
---|
29 | Installing json fixture 'srtest_dump' from absolute path.
|
---|
30 | Traceback (most recent call last):
|
---|
31 | File "manage.py", line 11, in <module>
|
---|
32 | execute_manager(settings)
|
---|
33 | File "/usr/local/lib/python2.5/site-packages/django/core/management/__init__.py", line 359, in execute_manager
|
---|
34 | utility.execute()
|
---|
35 | File "/usr/local/lib/python2.5/site-packages/django/core/management/__init__.py", line 304, in execute
|
---|
36 | self.fetch_command(subcommand).run_from_argv(self.argv)
|
---|
37 | File "/usr/local/lib/python2.5/site-packages/django/core/management/base.py", line 195, in run_from_argv
|
---|
38 | self.execute(*args, **options.__dict__)
|
---|
39 | File "/usr/local/lib/python2.5/site-packages/django/core/management/base.py", line 222, in execute
|
---|
40 | output = self.handle(*args, **options)
|
---|
41 | File "/usr/local/lib/python2.5/site-packages/django/core/management/commands/loaddata.py", line 196, in handle
|
---|
42 | cursor.execute(line)
|
---|
43 | File "/usr/local/lib/python2.5/site-packages/django/db/backends/util.py", line 19, in execute
|
---|
44 | return self.cursor.execute(sql, params)
|
---|
45 | psycopg2.ProgrammingError: COALESCE types text and integer cannot be matched
|
---|
46 |
|
---|
47 | This was tested with Django revision 10604
|
---|
48 | """
|
---|
49 | from django.contrib import admin
|
---|
50 | from django.db import models
|
---|
51 | from django_extensions.db.fields import UUIDField
|
---|
52 |
|
---|
53 | class Author(models.Model):
|
---|
54 | id = UUIDField(primary_key=True)
|
---|
55 | name = models.CharField(max_length=64)
|
---|
56 | def __unicode__(self):
|
---|
57 | return self.name
|
---|
58 |
|
---|
59 | class Book(models.Model):
|
---|
60 | id = UUIDField(primary_key=True)
|
---|
61 | title = models.CharField(max_length=64)
|
---|
62 | authors = models.ManyToManyField(Author, through='BookAuthors')
|
---|
63 | def __unicode__(self):
|
---|
64 | return self.title
|
---|
65 |
|
---|
66 | class BookAuthors(models.Model):
|
---|
67 | id = UUIDField(primary_key=True)
|
---|
68 | author = models.ForeignKey(Author)
|
---|
69 | book = models.ForeignKey(Book)
|
---|
70 | def __unicode__(self):
|
---|
71 | return "%s - %s" % (self.author, self.book)
|
---|
72 |
|
---|
73 |
|
---|
74 | class AuthorAdmin(admin.ModelAdmin):
|
---|
75 | pass
|
---|
76 | admin.site.register(Author, AuthorAdmin)
|
---|
77 |
|
---|
78 | class BookAdmin(admin.ModelAdmin):
|
---|
79 | pass
|
---|
80 | admin.site.register(Book, BookAdmin)
|
---|
81 |
|
---|
82 | class BookAuthorsAdmin(admin.ModelAdmin):
|
---|
83 | pass
|
---|
84 | admin.site.register(BookAuthors, BookAuthorsAdmin)
|
---|