Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将数据(即特定模型字段值)从夹层可显示模型迁移到新的自定义夹层页面模型?_Python_Django_Mezzanine - Fatal编程技术网

Python 如何将数据(即特定模型字段值)从夹层可显示模型迁移到新的自定义夹层页面模型?

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

我正在升级一个旧的Django/Mezzanine项目,需要将一个旧的
可显示的
模型(
作业
)转换为
页面
模型(
作业页面

旧的
作业
模型如下所示:

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)
    ]