#13818: Check Child IDs before creating parent IDs
------------------------------------------+---------------------------------
Reporter: pizzapanther | Owner: nobody
Status: new | Milestone:
Component: Database layer (models, ORM) | Version: 1.2
Keywords: | Stage: Unreviewed
Has_patch: 0 |
------------------------------------------+---------------------------------
When saving new models that are inherited Django currently creates the
parent model, gets a primary key and then uses this primary key in the
child model to relate it to the parent. This is 99.9% of the time fine
but we had some data inconsistency issues where the auto incremented
parent id was already used in the child table. Thus creating the parent
succeeds but creating the child fails. So it would be nice if Django when
creating the parent first checked if the primary key was already being
used in the child tables, and if it is being used to auto increment until
a valid ID is found.
I've included below our sample models and the traceback we received when
this happens.
{{{
class Content(models.Model):
headline = models.CharField(max_length=255,
blank=False)
def get_type(self):
try:
if self.newsbrief:
return 'News Briefs'
except DoesNotExist:
try:
if self.industryarticle:
return 'Industry Articles'
except DoesNotExist:
try:
if self.industrypaper:
return 'Industry Papers'
except DoesNotExist:
return 'Case Studies'
def __unicode__(self):
return self.headline
class NewsBrief(Content):
kicker = models.CharField(max_length=4096,
blank=True)
slug = models.SlugField(unique=True,
max_length=128, help_text=_("the slug dictates the permanent url of this
content."))
date = models.DateTimeField(help_text=_("date/time
that appears on article"))
byline = models.CharField(max_length=4096,
blank=True)
body_copy = models.TextField(blank=True, null=True)
file_name = models.CharField(max_length=256, blank=True)
file_upload = models.FileField(upload_to=file_path,
help_text=("Attach a file"), blank=True) # pdf
#related_products = models.ManyToManyField(Product, blank=True,
null=True)
tags = models.ManyToManyField(Tag, blank=True,
null=True)
}}}
{{{
Request Method: POST
Request URL: http://localhost:8000/admin/content/industryarticle/add/
Django Version: 1.2
Python Version: 2.6.4
Installed Applications:
['django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.admin',
'pagination',
'south',
'arnco.main',
'arnco.product',
'arnco.presence',
'arnco.content',
'arnco.order',
'arnco.tag']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'pagination.middleware.PaginationMiddleware')
Traceback:
File "/Users/sghael/virtualenvs/arnco/lib/python2.6/site-
packages/django/core/handlers/base.py" in get_response
100. response = callback(request, *callback_args,
**callback_kwargs)
File "/Users/sghael/virtualenvs/arnco/lib/python2.6/site-
packages/django/contrib/admin/options.py" in wrapper
239. return self.admin_site.admin_view(view)(*args,
**kwargs)
File "/Users/sghael/virtualenvs/arnco/lib/python2.6/site-
packages/django/utils/decorators.py" in _wrapped_view
76. response = view_func(request, *args, **kwargs)
File "/Users/sghael/virtualenvs/arnco/lib/python2.6/site-
packages/django/views/decorators/cache.py" in _wrapped_view_func
69. response = view_func(request, *args, **kwargs)
File "/Users/sghael/virtualenvs/arnco/lib/python2.6/site-
packages/django/contrib/admin/sites.py" in inner
190. return view(request, *args, **kwargs)
File "/Users/sghael/virtualenvs/arnco/lib/python2.6/site-
packages/django/utils/decorators.py" in _wrapper
21. return decorator(bound_func)(*args, **kwargs)
File "/Users/sghael/virtualenvs/arnco/lib/python2.6/site-
packages/django/utils/decorators.py" in _wrapped_view
76. response = view_func(request, *args, **kwargs)
File "/Users/sghael/virtualenvs/arnco/lib/python2.6/site-
packages/django/utils/decorators.py" in bound_func
17. return func(self, *args2, **kwargs2)
File "/Users/sghael/virtualenvs/arnco/lib/python2.6/site-
packages/django/db/transaction.py" in _commit_on_success
299. res = func(*args, **kw)
File "/Users/sghael/virtualenvs/arnco/lib/python2.6/site-
packages/django/contrib/admin/options.py" in add_view
795. self.save_model(request, new_object, form,
change=False)
File "/Users/sghael/virtualenvs/arnco/lib/python2.6/site-
packages/django/contrib/admin/options.py" in save_model
597. obj.save()
File "/Users/sghael/Documents/MWM/arnco/../arnco/content/models.py" in
save
53. super(IndustryArticle, self).save()
File "/Users/sghael/virtualenvs/arnco/lib/python2.6/site-
packages/django/db/models/base.py" in save
435. self.save_base(using=using, force_insert=force_insert,
force_update=force_update)
File "/Users/sghael/virtualenvs/arnco/lib/python2.6/site-
packages/django/db/models/base.py" in save_base
479. self.save_base(cls=parent, origin=org, using=using)
File "/Users/sghael/virtualenvs/arnco/lib/python2.6/site-
packages/django/db/models/base.py" in save_base
528. result = manager._insert(values,
return_id=update_pk, using=using)
File "/Users/sghael/virtualenvs/arnco/lib/python2.6/site-
packages/django/db/models/manager.py" in _insert
195. return insert_query(self.model, values, **kwargs)
File "/Users/sghael/virtualenvs/arnco/lib/python2.6/site-
packages/django/db/models/query.py" in insert_query
1479. return query.get_compiler(using=using).execute_sql(return_id)
File "/Users/sghael/virtualenvs/arnco/lib/python2.6/site-
packages/django/db/models/sql/compiler.py" in execute_sql
783. cursor = super(SQLInsertCompiler, self).execute_sql(None)
File "/Users/sghael/virtualenvs/arnco/lib/python2.6/site-
packages/django/db/models/sql/compiler.py" in execute_sql
727. cursor.execute(sql, params)
File "/Users/sghael/virtualenvs/arnco/lib/python2.6/site-
packages/django/db/backends/util.py" in execute
15. return self.cursor.execute(sql, params)
File "/Users/sghael/virtualenvs/arnco/lib/python2.6/site-
packages/django/db/backends/mysql/base.py" in execute
86. return self.cursor.execute(query, args)
File "build/bdist.macosx-10.6-i386/egg/MySQLdb/cursors.py" in execute
175. if not self._defer_warnings: self._warning_check()
File "build/bdist.macosx-10.6-i386/egg/MySQLdb/cursors.py" in
_warning_check
89. warn(w[-1], self.Warning, 3)
Exception Type: Warning at /admin/content/industryarticle/add/
Exception Value: Field 'content_pk' doesn't have a default value
}}}
--
Ticket URL: <http://code.djangoproject.com/ticket/13818>
Django <http://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/django-updates?hl=en.