#25129: Migration crash on ForeignKey with a callable default that returns a 
model
instance
--------------------------------------+------------------------
               Reporter:  timgraham   |          Owner:  nobody
                   Type:  Bug         |         Status:  new
              Component:  Migrations  |        Version:  1.8
               Severity:  Normal      |       Keywords:
           Triage Stage:  Accepted    |      Has patch:  0
    Needs documentation:  0           |    Needs tests:  0
Patch needs improvement:  0           |  Easy pickings:  0
                  UI/UX:  0           |
--------------------------------------+------------------------
 For example, this model in Django's test suite (from
 `tests/delete/models.py`):
 {{{#!python
 class R(models.Model):
     is_default = models.BooleanField(default=False)

 def get_default_r():
     return R.objects.get_or_create(is_default=True)[0]

 class A(models.Model):
     setdefault = models.ForeignKey(R, default=get_default_r)
 }}}
 will fail like this:
 {{{
   File "/home/tim/code/django/django/db/migrations/migration.py", line
 123, in apply
     operation.database_forwards(self.app_label, schema_editor, old_state,
 project_state)
   File "/home/tim/code/django/django/db/migrations/operations/fields.py",
 line 62, in database_forwards
     field,
   File "/home/tim/code/django/django/db/backends/sqlite3/schema.py", line
 224, in add_field
     self._remake_table(model, create_fields=[field])
   File "/home/tim/code/django/django/db/backends/sqlite3/schema.py", line
 104, in _remake_table
     self.effective_default(field)
   File "/home/tim/code/django/django/db/backends/base/schema.py", line
 214, in effective_default
     default = field.get_db_prep_save(default, self.connection)
   File "/home/tim/code/django/django/db/models/fields/related.py", line
 2017, in get_db_prep_save
     return self.target_field.get_db_prep_save(value,
 connection=connection)
   File "/home/tim/code/django/django/db/models/fields/__init__.py", line
 721, in get_db_prep_save
     prepared=False)
   File "/home/tim/code/django/django/db/models/fields/__init__.py", line
 969, in get_db_prep_value
     value = self.get_prep_value(value)
   File "/home/tim/code/django/django/db/models/fields/__init__.py", line
 977, in get_prep_value
     return int(value)
 TypeError: int() argument must be a string or a number, not 'R'
 }}}
 The issue is that
 
[https://github.com/django/django/blob/c52822e7501e8478abf99465d8c9f3102dde618a/django/db/models/fields/related.py#L2003-L2008
 ForeignKey.get_default()] doesn't return the model instance's ID because
 `self.remote_field.model` is `<class '__fake__.R'>` when migrating while
 the default function returns a "real" model instance.

--
Ticket URL: <https://code.djangoproject.com/ticket/25129>
Django <https://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 unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/052.03f8937833d667e84a3d8540a8f75a9d%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to