UnicodeDecodeError: Can't save unicode string to database

I have a unicode string derived from xml via lxml:

>>> name
u'\u0414\u0438\u0434\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0442\u043e\u043b \u0438\u0437 \u043c\u044f\u0433\u043a\u0438\u0445 \u0431\u043b\u043e\u043a\u043e\u0432.'

When I try to save it as a value of one of model's attributes I get error

product = Product(name=name, slug='er', category=c, description='wer', price=1)

UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 12: ordinal not in range(128)

Full traceback:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/oleshko/design/detsad-komplekt/project/catalog/tools.py", line 31, in parseCML
    product = Product(name=name, slug='er', category=c, description='wer', price=1)
  File "/home/oleshko/design/.virtualenvs/detsad-komplekt/local/lib/python2.7/site-packages/django/db/models/base.py", line 468, in __init__
    setattr(self, field.name, rel_obj)
  File "/home/oleshko/design/.virtualenvs/detsad-komplekt/local/lib/python2.7/site-packages/django/db/models/fields/related.py", line 627, in __set__
    self.field.rel.to._meta.object_name,
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 12: ordinal not in range(128)

Here is my function:

def parseCML():
    with open('/home/oleshko/desktop/webdata/import1.xml', 'r') as xml_file:
        tree = etree.parse(xml_file)
    root = tree.getroot()
    elems = root[1][4]
    res = []
    for prod in elems:
        for cat in prod[4]:
            c = Category.objects.filter(integration_id=cat.text)       
        name = prod[2].text
        product = Product(name=name, slug='er', category=c, description='wer', price=1)

    return name

Product model definition:

@python_2_unicode_compatible
class Product(TimeStampedModel):
    """ Product base class """
    sku = models.CharField(verbose_name='Артикул', max_length=50, blank=True, null=True)
    name = models.CharField( verbose_name='Название', max_length = 254 )
    slug = models.SlugField( max_length = 50, unique = True, help_text = 'название для URL' )
    category = models.ForeignKey(Category, verbose_name='Категория продукта', related_name='products')
    producer = models.ForeignKey(Producer, verbose_name='Бренд', related_name='producer_products', blank=True, null=True)
    description = RichTextField( verbose_name='Описание продукта', blank=True)
    collection = models.CharField(db_index=True, max_length=100, blank=True, verbose_name='Коллекция')
    price = models.DecimalField(verbose_name='Цена', max_digits=8, decimal_places=2)


    objects = InheritanceManager()

    def __str__(self):
        return self.name

Upvotes: 0

Views: 497

Answers (1)

catavaran
catavaran

Reputation: 45555

You are trying to set invalid value to the Product.category field. It should be the instance, not the queryset. Try to use the first() method to get the Category instance:

c = Category.objects.filter(integration_id=cat.text).first()
...
product = Product(name=name, slug='er', category=c, description='wer', price=1)

I suspect that the unicode error occurs when django builds the error message for invalid field value.

Upvotes: 2

Related Questions