#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 [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.116a26ff59668889a66cd9c039795ff3%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to