old_contents: # -*- coding: utf-8 -*-
  # Generated by Django 1.11 on 2018-06-12 11:24
  from __future__ import unicode_literals
  import os
  from json import load
  
  from django.db import migrations, models
  from django.core import serializers
  
  
  TMP_FILE = '/tmp/djing_ip_field_devapp_migrate.json'
  
  
  def device_backup_info(apps, _):
      Device = apps.get_model('devapp', 'Device')
      obs = Device.objects.all()
      with open(TMP_FILE, 'w') as f:
          serializers.serialize('json', obs, stream=f)
  
  
  def device_restore_info_to_new_scheme(apps, _):
      Device = apps.get_model('devapp', 'Device')
      with open(TMP_FILE, 'r') as f:
          for device in load(f):
              Device.objects.filter(pk=device['pk']).update(ip_address=device['fields']['ip_address'])
      if os.path.isfile(TMP_FILE):
          os.remove(TMP_FILE)
  
  
  class Migration(migrations.Migration):
  
      dependencies = [
          ('devapp', '0004_device_extra_data'),
      ]
  
      operations = [
          migrations.RunPython(device_backup_info),
          migrations.AlterField(
              model_name='device',
              name='ip_address',
              field=models.GenericIPAddressField(blank=True, null=True, protocol='ipv4', verbose_name='Ip address'),
          ),
          migrations.RunPython(device_restore_info_to_new_scheme)
      ]
  
new_contents: # -*- coding: utf-8 -*-
  # Generated by Django 1.11 on 2018-08-08 17:31
  from __future__ import unicode_literals
  from json import load
  import os
  from django.core import serializers
  
  from django.db import migrations, models
  
  
  TMP_FILE = '/tmp/djing_ip_field_devapp_migrate.json'
  
  
  def device_backup_info(apps, _):
      Device = apps.get_model('devapp', 'Device')
      obs = Device.objects.exclude(ip_address=None).only('ip_address')
      with open(TMP_FILE, 'w') as f:
          serializers.serialize('json', obs, stream=f, fields=('ip_address',))
  
  
  def device_restore_info_to_new_scheme(apps, _):
      Device = apps.get_model('devapp', 'Device')
      with open(TMP_FILE, 'r') as f:
          for device in load(f):
              Device.objects.filter(pk=device['pk']).update(ip_address=device['fields']['ip_address'])
      if os.path.isfile(TMP_FILE):
          os.remove(TMP_FILE)
  
  
  class Migration(migrations.Migration):
      dependencies = [
          ('devapp', '0004_device_extra_data'),
      ]
  
      operations = [
          migrations.RunPython(device_backup_info),
          migrations.AlterField(
              model_name='device',
              name='ip_address',
              field=models.GenericIPAddressField(blank=True, null=True, verbose_name='Ip address'),
          ),
          migrations.RunPython(device_restore_info_to_new_scheme)
      ]
  
subject: Optimize migrate to new ip address field type