#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.