Django Sites Framework: Initial Data Migration Location

后端 未结 3 1585
不思量自难忘°
不思量自难忘° 2020-12-16 14:06

Before Django 1.7, when using the Django Sites Framework one could/should define the initial data using Initial Fixtures.

myproject/fixtures/initial_

相关标签:
3条回答
  • 2020-12-16 14:22

    You just need to reference the highest-numbered sites migration as a dependency.

    def forward(apps, schema_editor):
        Site = apps.get_model("sites", "Site")
        db_alias = schema_editor.connection.alias
        s, created = Site.objects.using(db_alias).get_or_create(pk=1)
        s.name = APP_NAME
        s.domain = APP_NAME
        s.save()
    
    
    def reverse(apps, schema_editor):
        Site = apps.get_model("sites", "Site")
        db_alias = schema_editor.connection.alias
        s = Site.objects.using(db_alias).get(pk=1)
        s.name = ORIG_APP_NAME
        s.domain = ORIG_APP_NAME
        s.save()
    
    
    class Migration(migrations.Migration):
    
        dependencies = [
    
            # `core` is the app containing this migration
            ('core', '0001_initial'),
    
            # `0002_alter_domain_unique` is the highest-numbered migration for
            # the sites framework
            ('sites', '0002_alter_domain_unique'),
    
        ]
    
        operations = [
            migrations.RunPython(forward, reverse)
        ]
    

    This was tested on Django 1.11.2.

    Fwiw, the MODULE_MIGRATIONS solution above does not work for me.

    0 讨论(0)
  • 2020-12-16 14:24

    A couple of tweaks to @Jason's answer. Last tested with Django 2.2.

    from django.conf import settings
    from django.db import migrations
    
    
    def update_site_domain(apps, schema_editor):
        Site = apps.get_model("sites", "Site")
        s, _ = Site.objects.get_or_create(pk=settings.SITE_ID)
        s.domain = settings.HOST
        s.save()
    
    
    class Migration(migrations.Migration):
    
        dependencies = [
            ("your_app", "last_migration_name"),
            ("sites", "0002_alter_domain_unique"),  # highest-numbered migration for the sites framework
        ]
    
        operations = [migrations.RunPython(update_site_domain)]
    
    0 讨论(0)
  • 2020-12-16 14:28

    First, configure MODULE_MIGRATIONS in your django settings:

    MIGRATION_MODULES = {
        'sites': 'myproject.fixtures.sites_migrations',
    }
    

    Then, run ./manage.py makemigrations sites to have django create the directory and create 0001_intitial.py in the myproject.fixtures.sites_migrations package.

    Then, do ./manage.py makemigrations --empty sites. The migration file should be created in the specified package.

    My file 0002_initialize_sites.py looks like this:

    -*- coding: utf-8 -*-
    from __future__ import unicode_literals
    
    from django.db import migrations
    
    
    def insert_sites(apps, schema_editor):
        """Populate the sites model"""
        Site = apps.get_model('sites', 'Site')
        Site.objects.all().delete()
    
        # Register SITE_ID = 1
        Site.objects.create(domain='create.tourtodo.com', name='create')
        # Register SITE_ID = 2
        Site.objects.create(domain='www.tourtodo.com', name='www')
    
    
    class Migration(migrations.Migration):
    
        dependencies = [
            ('sites', '0001_initial'),
        ]
    
        operations = [
            migrations.RunPython(insert_sites)
        ]
    
    0 讨论(0)
提交回复
热议问题