0006_auto_20201012_1520.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. # Generated by Django 3.0.8 on 2020-10-12 15:20
  2. from django.db import migrations, models
  3. from django.utils.text import slugify
  4. def forwards_func(apps, schema_editor):
  5. SnapshotModel = apps.get_model("core", "Snapshot")
  6. TagModel = apps.get_model("core", "Tag")
  7. db_alias = schema_editor.connection.alias
  8. snapshots = SnapshotModel.objects.all()
  9. for snapshot in snapshots:
  10. tags = snapshot.tags
  11. tag_set = (
  12. set(tag.strip() for tag in (snapshot.tags_old or '').split(','))
  13. )
  14. tag_set.discard("")
  15. for tag in tag_set:
  16. to_add, _ = TagModel.objects.get_or_create(name=tag, defaults={'slug': slugify(tag)})
  17. snapshot.tags.add(to_add)
  18. def reverse_func(apps, schema_editor):
  19. SnapshotModel = apps.get_model("core", "Snapshot")
  20. TagModel = apps.get_model("core", "Tag")
  21. db_alias = schema_editor.connection.alias
  22. snapshots = SnapshotModel.objects.all()
  23. for snapshot in snapshots:
  24. tags = snapshot.tags.values_list("name", flat=True)
  25. snapshot.tags_old = ",".join([tag for tag in tags])
  26. snapshot.save()
  27. class Migration(migrations.Migration):
  28. dependencies = [
  29. ('core', '0005_auto_20200728_0326'),
  30. ]
  31. operations = [
  32. migrations.RenameField(
  33. model_name='snapshot',
  34. old_name='tags',
  35. new_name='tags_old',
  36. ),
  37. migrations.CreateModel(
  38. name='Tag',
  39. fields=[
  40. ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
  41. ('name', models.CharField(max_length=100, unique=True, verbose_name='name')),
  42. ('slug', models.SlugField(max_length=100, unique=True, verbose_name='slug')),
  43. ],
  44. options={
  45. 'verbose_name': 'Tag',
  46. 'verbose_name_plural': 'Tags',
  47. },
  48. ),
  49. migrations.AddField(
  50. model_name='snapshot',
  51. name='tags',
  52. field=models.ManyToManyField(to='core.Tag'),
  53. ),
  54. migrations.RunPython(forwards_func, reverse_func),
  55. migrations.RemoveField(
  56. model_name='snapshot',
  57. name='tags_old',
  58. ),
  59. ]