#25771: Serialization of natural foreign key in migration scripts does not work
----------------------------+----------------------------------------------
     Reporter:  bowensong   |      Owner:  nobody
         Type:  Bug         |     Status:  new
    Component:              |    Version:  1.8
  Uncategorized             |
     Severity:  Normal      |   Keywords:  database migration serialization
 Triage Stage:  Unreviewed  |  Has patch:  0
Easy pickings:  0           |      UI/UX:  0
----------------------------+----------------------------------------------
 The `serializers.serialize(..., use_natural_foreign_keys=True)` is not
 working in migration scripts, the `ManyToManyField` always have the value
 of the `pk` instead of the `natural_key`

 An example to reproduce this bug:

 models.py
 {{{
 # -*- coding: utf-8 -*-
 from django.db import models


 class Student(models.Model):
     student_id = models.CharField(max_length=10, unique=True)
     name = models.CharField(max_length=30)

     def __unicode__(self):
         return self.name

     def natural_key(self):
         return self.student_id


 class Teacher(models.Model):
     name = models.CharField(max_length=30)
     students = models.ManyToManyField(Student)

     def __unicode__(self):
         return self.name
 }}}


 migrations/0002_example.py
 {{{
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals

 from django.db import migrations, models
 from django.core import serializers


 def example(apps, schema_editor):
     Teacher = apps.get_model("mytest", "Teacher")
     json_data = serializers.serialize('json', Teacher.objects.all(),
 use_natural_foreign_keys=True)
     print json_data


 class Migration(migrations.Migration):

     dependencies = [
         ('mytest', '0001_initial'),
     ]

     operations = [
         migrations.RunPython(example,
 reverse_code=migrations.RunPython.noop)
     ]
 }}}

 I applied the initial migration, and inserted some data into those tables.

 The dumpdata command output is:
 {{{
 $ python manage.py dumpdata mytest --natural-foreign
 [{"fields": {"student_id": "1234567890", "name": "Alice"}, "model":
 "mytest.student", "pk": 1}, {"fields": {"student_id": "9876543210",
 "name": "Bob"}, "model": "mytest.student", "pk": 2}, {"fields":
 {"students": ["1234567890", "9876543210"], "name": "Petter"}, "model":
 "mytest.teacher", "pk": 1}]
 }}}

 When running the migrate command, output is:
 {{{
 $ python manage.py migrate mytest 0002
 Operations to perform:
   Target specific migration: 0002_example, from mytest
 Running migrations:
   Rendering model states... DONE
   Applying mytest.0002_example...[{"fields": {"students": [1, 2], "name":
 "Petter"}, "model": "mytest.teacher", "pk": 1}]
  OK
 }}}

 Expected output is:
 {{{
 $ python manage.py migrate mytest 0002
 Operations to perform:
   Target specific migration: 0002_example, from mytest
 Running migrations:
   Rendering model states... DONE
   Applying mytest.0002_example...[{"fields": {"students": ["1234567890",
 "9876543210"], "name": "Petter"}, "model": "mytest.teacher", "pk": 1}]
  OK
 }}}

--
Ticket URL: <https://code.djangoproject.com/ticket/25771>
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 django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/052.116a26ff59668889a66cd9c039795ff3%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to