所以基本上我有一个我正在制作的应用程序,它有用户数据,我想在数据库中备份和加载。我将数据存储在yml文件中。现在,用户有帖子。每个帖子都有时间戳,文本和标签。我想在YAML文件中写入数据时使用ordereddictionary来保留顺序。目前,我正在做这样的事情:
def get_posts(user):
posts_arr = []
for post in user.posts.all():
temparr = OrderedDict()
temparr['timestamp'] = post.created_at.strftime("%Y-%m-%d %H:%M %p")
temparr['text'] = post.text
temparr['tags'] = (',').join(list(post.tags.all().values_list('field',flat=True)))
posts_arr.append(temparr)
return posts_arr
正如你所看到的,我正在使用一系列orderectionaries,我认为这是我订购每个用户的帖子的原因。我该如何解决这个问题。
我将这个posts_arr对象返回到另一个ordereddictionary中。
另外,由于帖子文本是嵌套的并且是一大块文本,我想确保文本也存储在字符串文字块样式中。
基本上,你的问题是对有序字典在python中如何工作的误解。 python文档声明OrderedDict是:
记住订单条目的dict子类已添加
https://docs.python.org/3/library/collections.html#module-collections
就个人而言,我建议从预先排序的帖子列表中创建一个词典列表。在这种情况下,如果我们按原样保留大部分代码,它将看起来像这样:
def get_posts(user):
posts_arr = []
sorted_posts = sorted(user.posts.all(), key=(lambda post: post.created_at)) # Sorts the posts based on their created_at date
for post in sorted_posts:
temparr = dict()
temparr['timestamp'] = post.created_at.strftime("%Y-%m-%d %H:%M %p")
temparr['text'] = post.text
temparr['tags'] = (',').join(list(post.tags.all().values_list('field',flat=True)))
posts_arr.append(temparr)
return posts_arr
您可以使用列表推导来从排序的列表构建此列表,如chepner建议,但我不想改变太多。
每个帖子使用普通的dict
(如果你真的需要的话是OrderedDict
),并使用列表收集所有帖子。一旦你这样做,使用列表推导直接定义返回值是一个短暂的跳跃。
def get_posts(user):
return [{
'timestamp': post.created_at.strftime("%Y-%m-%d %H:%M %p"),
'text': post.text,
'tags': ','.join(list(post.tags.all().values_list('field', flat=True)))
} for post in user.posts.all()]