在使用mongoengine操作mongodb时,利用Field的get_*_display()方法快速显示。
定义model时需要制定Field的choices。
# mongoengine 0.11.0
from mongoengine import connect, Document
from mongoengine import IntField, StringField
connect('default-db')
# 定义一些常量
USER_STATUS_ACTIVE = 1
USER_STATUS_INACTIVE = 0
USER_STATUS_LIST = [(USER_STATUS_ACTIVE, u'启用'), (USER_STATUS_INACTIVE, u'禁用')]
JIANGSU_CODE = 'JS'
SHANGHAI_CODE = 'SH'
PROVINCE_CODE_LIST = [(JIANGSU_CODE, '江苏'), (SHANGHAI_CODE, '上海')]
# 定义一个User model
class User(Document):
name = StringField(max_length=50, default='') # 用户名
province = StringField(choices=PROVINCE_CODE_LIST) # 城市
status = IntField(
choices=USER_STATUS_LIST, default=USER_STATUS_INACTIVE) # 用户状态
# 准备数据
# User.objects.delete()
for i in range(1, 10):
name = 'JiangW' + str(i)
status = 0
if i % 2 == 0:
status = 1
province = JIANGSU_CODE if i > 3 else SHANGHAI_CODE
User(name=name, status=status, province=province).save()
# 查询并输出数据
user_list = User.objects.all()
for user in user_list:
print(user.name, user.status, user.get_status_display(),
user.province, user.get_province_display())
# JiangW1 0 禁用 SH 上海
# JiangW2 1 启用 SH 上海
# JiangW3 0 禁用 SH 上海
# JiangW4 1 启用 JS 江苏
# JiangW5 0 禁用 JS 江苏
# JiangW6 1 启用 JS 江苏
# JiangW7 0 禁用 JS 江苏
# JiangW8 1 启用 JS 江苏
# JiangW9 0 禁用 JS 江苏
此时利用get_*_display能够快速的根据数据库中存放的user.status从所指定的choices,即USER_STATUS_LIST中获取所需的中文字符串展示,province同理。
但在项目中使用的是mongoengine旧版本0.10.5,在使用get_*_display()方法时出现如下问题。
在User.objects.all()时,所获得的get_*_display()数据异常,输出时将最后一个元素的值代替了所有元素的值。
user_list = User.objects.all()
for user in user_list:
print(user.name, user.status, user.get_status_display(),
user.province, user.get_province_display())
# JiangW1 0 禁用 SH 江苏
# JiangW2 1 禁用 SH 江苏
# JiangW3 0 禁用 SH 江苏
# JiangW4 1 禁用 JS 江苏
# JiangW5 0 禁用 JS 江苏
# JiangW6 1 禁用 JS 江苏
# JiangW7 0 禁用 JS 江苏
# JiangW8 1 禁用 JS 江苏
# JiangW9 0 禁用 JS 江苏
利用下标取值正常。
user_list = User.objects.all()
for index, user in enumerate(user_list):
print(user.name, user.status, user_list[index].get_status_display(),
user.province, user_list[index].get_province_display())
网友评论