复制具有管理功能的元素

时间:2013-10-21 12:27:08

标签: python django python-2.7 utf-8 python-unicode

我尝试运行此代码:

# -*- coding: utf-8 -*-

from django.core.management.base import BaseCommand

class Command(BaseCommand):
    def handle(self, *args, **options):

        from blogs.models import Blog, Post
        from sitename.settings import DEFAULT_CHARSET

        for blog in Blog.objects.all().using('old'):
            try:
                Blog.objects.get(old_id=blog.id)
                continue
            except:
                pass
            new_blog = Blog(
                name =      blog.name,
                description=blog.description,
                old_id =   blog.id
            )
            new_blog.save()

但我有例外:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)

我搜索了这个问题并找到了这个解决方案:

name = blog.name.encode('ascii','ignore')

结果令人不安:所有俄罗斯符号都被删除了。

"Пост номер 15-14" => "15-14"

如何正确复制数据?

1 个答案:

答案 0 :(得分:1)

我想,你有一个或两个数据库的字符集有问题,你应该检查你从旧数据库获得的编码以及新数据库中的内容。

你的循环看起来很奇怪,Django在get_or_create上有一个很好的函数QuerySet方法,所以有很好的版本:

for blog in Blog.objects.all().using('old'):
    Blog.objects.get_or_create(old_id=blog.id, defaults={'name': blog.name,
                                                         'description': blog.description})