Python 如何将数据(即特定模型字段值)从夹层可显示模型迁移到新的自定义夹层页面模型?
我正在升级一个旧的Django/Mezzanine项目,需要将一个旧的Python 如何将数据(即特定模型字段值)从夹层可显示模型迁移到新的自定义夹层页面模型?,python,django,mezzanine,Python,Django,Mezzanine,我正在升级一个旧的Django/Mezzanine项目,需要将一个旧的可显示的模型(作业)转换为页面模型(作业页面) 旧的作业模型如下所示: class Job(Displayable): job_title = models.CharField(max_length=300) job_type = models.IntegerField(choices=job_values.TYPES) location = models.IntegerField(choices=jo
可显示的模型(作业)转换为页面模型(作业页面)
旧的作业
模型如下所示:
class Job(Displayable):
job_title = models.CharField(max_length=300)
job_type = models.IntegerField(choices=job_values.TYPES)
location = models.IntegerField(choices=job_values.LOCATION)
job_group = models.IntegerField(choices=job_values.GROUPS)
job_description = RichTextField(blank=True, null=True)
job_qualifications = RichTextField(blank=True, null=True)
contact_name = models.CharField(max_length=200, blank=True, null=True)
contact_attach = models.CharField(max_length=500, blank=True, null=True)
contact_email = models.EmailField()
def __unicode__(self):
return self.job_title
@property
def job_id_on_page(self):
return slugify(self.job_title)
def get_page_slug(self):
return "/%s#%s" % (job_values.URLS[self.job_group], self.job_id_on_page)
def get_absolute_url(self):
return self.get_page_slug()
def save(self, *args, **kwargs):
self.title = self.job_title
self.slug = "job-listing/%s" % slugify(self.job_title)
我创建了作业页面
模型,如下所示:
class JobPage(Page):
job_title = models.CharField(max_length=300)
job_type = models.IntegerField(choices=job_values.TYPES)
location = models.IntegerField(choices=job_values.LOCATION)
job_group = models.IntegerField(choices=job_values.GROUPS)
job_description = RichTextField(blank=True, null=True)
job_qualifications = RichTextField(blank=True, null=True)
contact_name = models.CharField(max_length=200, blank=True, null=True)
contact_attach = models.CharField(max_length=500, blank=True, null=True)
contact_email = models.EmailField()
def save(self, *args, **kwargs):
self.title = self.job_title
self.slug = "job-listing/%s" % slugify(self.job_title)
super(JobPage, self).save(*args, **kwargs)
def __unicode__(self):
return self.job_title
然后跑:
python manage.py makemigratons
python manage.py migrate
我传输数据的策略是进行Django数据迁移(因为我使用的是Mezzanine 4+和Django 1.8,而Fixture正被弃用):
我进入jobapp/migrations
,打开空迁移,然后键入以下内容:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
from mezzanine.utils.urls import slugify
def dump_into_jobpage(apps, schema_editor):
Job = apps.get_model('jobapp','Job')
JobPage = apps.get_model('jobapp','JobPage')
fields = ['job_title', 'job_type', 'location', 'job_group',
'job_description', 'job_qualifications', 'contact_name',
'contact_attach', 'contact_email']
site_id = JobPage._meta.get_field('site_id')
data_dict = {"site_id":1}
for j in Job.objects.all():
for field in fields:
try:
value = getattr(j, field)
data_dict[field] = value
except:
pass
data_dict['title'] = data_dict['job_title']
data_dict['slug'] = 'job-listing/%s' % slugify(data_dict['job_title'])
JobPage(**data_dict).save()
class Migration(migrations.Migration):
dependencies = [
('jobapp', '0028_jobpage'),
]
operations = [
migrations.RunPython(dump_into_jobpage)
]
然后我运行:
python manage.py migrate
并探讨:
python manage.py shell
检查已正确迁移的所有数据,包括本机页面
slug
字段(这会导致以后出现问题)。我成功打印了作业页面
模型的所有slug
字段
当我运行服务器时,问题开始出现,转到管理页面,并尝试单击“页面”,这样我就可以看到一切是否顺利运行。当然,它的运行并不顺利。我得到以下错误:
Error during template rendering
**In template /home/vagrant/.virtualenvs/newcorpsite/local/lib/python2.7/site-packages/mezzanine/pages/templates/admin/pages/page/change_list.html, error at line 40**
'NoneType' object has no attribute 'replace'
30 <option value="{{ model.add_url }}">{{ model.meta_verbose_name|capfirst }}</option>
31 {% endif %}
32 {% endfor %}
33 </select>
34 </div>
35 {% endif %}
36
37 {% if cl.result_count == 0 %}
38 <p class="paginator">0 {{ cl.opts.verbose_name_plural }}</p>
39 {% else %}
40
**<div id="tree">
{% page_menu "pages/menus/admin.html" %}
</div>**
41 {% endif %}
42
43 </div>
44 {% endblock %}
因此,基本上,对于一个或多个JobPage
s,没有slug
字段,即使我刚刚在PYTHON SHELL中看到了slug属性
我对这个有点疯狂。有人知道为什么这些字段值不会保持不变吗?我在上面发布的代码是在多次尝试找出如何做到这一点的失败迭代之后创建的。在那些失败的迭代过程中,我将JobPage
模型添加到数据库中,然后又多次删除它,因为我遇到了不同的错误,并尝试了不同的字段和字段类型。显然,当您删除页面模型时,其对象不会从.pages\u page
数据库中消失(pages\u page
是夹层page
模型数据库)。相反,它会留下旧条目。如果随后直接删除其中一个对象,则如下所示:
Page.objects.get(field=value).delete()
或者删除/不填写字段,对象实际上不会消失,而是留下一个null/None数据库条目。但是,页面
对象保留其id
字段。我不知道我是否有奇怪的设置导致了这一切,是否是夹层的东西,或者是Django的东西,但这就是发生的原因。我得到了NoneType
错误,因为Mezzanine在pages\u Page
数据库中看到一个页面的条目,并试图在管理菜单中为其创建一个项目。很好,除了该页面的所有条目都是无
。我无法删除python shell中的None
对象,因为我会得到一个错误不能将None用作查询值
,但我可以打印单个id
,将它们写下来,并使用它们的id
手动删除mysql
shell中的页面
对象
那时,我能够使用上面的所有代码成功地创建新的JobPage
另一个警告是,我必须将此迁移添加到JobPage
模型中,因为通过Django数据迁移创建它们不会填充content\u model
字段:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
def update_jobpage(apps, schema_editor):
JobPage = apps.get_model('jobapp','JobPage')
JobPage.objects.all().update(content_model='jobpage')
class Migration(migrations.Migration):
dependencies = [
('jobapp', '0029_auto_20150911_1624'),
]
operations = [
migrations.RunPython(update_jobpage)
]
如果没有content\u model
字段,Mezzanine无法使用其内置的get\u content\u model()
函数来确定它试图放在管理菜单上的页面是基于什么自定义内容类型的(在本例中为JobPage
)。因此,它会抛出一个错误并阻止您使用该页面
我错过什么了吗?当我删除模型时,为什么旧的JobPage
条目没有消失?为什么直接在Python中删除它们会留下一个NoneType
对象,所以我必须在MySQL中手动删除它们
Page.objects.get(field=value).delete()
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
def update_jobpage(apps, schema_editor):
JobPage = apps.get_model('jobapp','JobPage')
JobPage.objects.all().update(content_model='jobpage')
class Migration(migrations.Migration):
dependencies = [
('jobapp', '0029_auto_20150911_1624'),
]
operations = [
migrations.RunPython(update_jobpage)
]