关于django __str__ 与 __unicode__ 问题

本文探讨了Django框架如何处理从数据库检索的Unicode字符串,解释了为何在创建模型时应考虑Unicode,以及如何正确实现__unicode__()和__str__()方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为所有字符串都作为Unicode字符串从数据库返回,基于字符的模型字段(CharField、TextField、URLField等)在Django从数据库检索数据时将包含Unicode值。即使数据可以放入ASCII字节字符串,也总是如此。


您可以在创建模型或填充字段时传入bytestring,并且Django会在需要时将其转换为Unicode。


¶选择__str__()和__unicode__()

请注意


如果您在python3上,您可以跳过这一部分,因为您总是会创建__str__()而不是__unicode__()。如果希望与Python 2兼容,可以使用python_2_unicode_compatible()来修饰模型类。


默认情况下使用Unicode的一个结果是,在从模型中打印数据时必须小心。


特别是,我们建议您实现__unicode__()方法,而不是给您的模型一个__str__()方法。在__unicode__()方法中,您可以非常安全地返回所有字段的值,而不必担心它们是否适合于bytestring。(按照Python的工作方式,__str__()的结果总是bytestring,即使您意外地试图返回Unicode对象)。


当然,如果您愿意,您仍然可以在模型上创建__str__()方法,但是您不需要这样做,除非您有充分的理由。Django的模型基类自动提供了一个__str__()实现,它调用__unicode__()并将结果编码为UTF-8。这意味着您通常只需要实现__unicode__()方法,并在需要时让Django处理对bytestring的强制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值