Django 迁移文件don';不要更改站点名称和域
我有这个迁移文件:Django 迁移文件don';不要更改站点名称和域,django,migration,sites,django-sites,Django,Migration,Sites,Django Sites,我有这个迁移文件: from django.db import migrations from django.contrib.sites.models import Site as DjangoSite def change_django_site(apps, schema_editor): site = DjangoSite.objects.get(id=1) site.delete() DjangoSite.objects.get_or_create(id=1,
from django.db import migrations
from django.contrib.sites.models import Site as DjangoSite
def change_django_site(apps, schema_editor):
site = DjangoSite.objects.get(id=1)
site.delete()
DjangoSite.objects.get_or_create(id=1, domain='www.xprende.com', name='XPrende')
def create_homepage(apps, schema_editor):
# Get models
ContentType = apps.get_model('contenttypes.ContentType')
Page = apps.get_model('wagtailcore.Page')
Site = apps.get_model('wagtailcore.Site')
HomePage = apps.get_model('home.HomePage')
# Delete the default homepage
# If migration is run multiple times, it may have already been deleted
Page.objects.filter(id=2).delete()
# Create content type for homepage model
homepage_content_type, __ = ContentType.objects.get_or_create(
model='homepage', app_label='home')
# Create a new homepage
homepage = HomePage.objects.create(
title="Home",
draft_title="Home",
slug='home',
content_type=homepage_content_type,
path='00010001',
depth=2,
numchild=0,
url_path='/home/',
)
# Create a site with the new homepage set as the root
Site.objects.create(
hostname='www.xprende.com', site_name='XPrende', root_page=homepage, is_default_site=True
)
def remove_homepage(apps, schema_editor):
# Get models
ContentType = apps.get_model('contenttypes.ContentType')
HomePage = apps.get_model('home.HomePage')
# Delete the default homepage
# Page and Site objects CASCADE
HomePage.objects.filter(slug='home', depth=2).delete()
# Delete content type for homepage model
ContentType.objects.filter(model='homepage', app_label='home').delete()
class Migration(migrations.Migration):
dependencies = [
('home', '0001_initial'),
('sites', '0002_alter_domain_unique'),
]
operations = [
migrations.RunPython(
create_homepage,
remove_homepage,
change_django_site,
),
]
如您所见,我创建了一个函数,必须更改django
站点名称和域。但它不能做到这一点,在应用迁移后,我会得到相同的默认值:
In [3]: DjangoSite.objects.get(id=1)
Out[3]: <Site: example.com>
In [4]: DjangoSite.objects.get(id=1).name
Out[4]: 'example.com'
In [5]: DjangoSite.objects.get(id=1).domain
Out[5]: 'example.com'
In [6]: DjangoSite.objects.all()
Out[6]: <QuerySet [<Site: example.com>]>
[3]中的:DjangoSite.objects.get(id=1)
出[3]:
[4]中:DjangoSite.objects.get(id=1.name)
Out[4]:'example.com'
[5]中:DjangoSite.objects.get(id=1.domain)
Out[5]:'example.com'
[6]中:DjangoSite.objects.all()
出[6]:
我不明白为什么,我把站点
迁移作为这个迁移文件的依赖项,但它仍然不起作用
谁能解释一下我为什么会犯这个错误
谢谢。您必须作为单独的操作运行
change\u django\u站点
:
class Migration(migrations.Migration):
dependencies = [
('home', '0001_initial'),
('sites', '0002_alter_domain_unique'),
]
operations = [
migrations.RunPython(change_django_site, reverse_code=migrations.RunPython.noop),
migrations.RunPython(create_homepage, reverse_code=remove_homepage),
]
和change\u django\u站点
必须
def change_django_site(apps, schema_editor):
DjangoSite = apps.get_model('sites', 'Site')
site = DjangoSite.objects.get_or_create(id=1)
site.domain='www.xprende.com'
site.name='XPrende'
site.save()
您确定运行了迁移并且迁移运行时没有错误吗?您是否可以删除
change\u django\u站点
迁移,再次运行并检查DjangoSites.objects.count()
是否等于0。您是否已将此函数添加到migration.operations
列表中?@zvadym您看到代码了吗?是的,我做了,不幸的是它不起作用。@Salahadin抱歉,我没有注意到滚动..停止,为什么migrations.RunPython
有三个参数RunPython(code,reverse\u code=None,atomic=None,hints=None,elidable=False)
。因此,change\u django\u site
分配给atomic
请将此更改添加到我的函数中:``def change\u django\u site(应用程序,架构编辑器):DjangoSite=apps.get\u model('sites','site')DjangoSite.objects.get\u或\u create(id=1,domain='www.xprende.com',name='xprende')```