OrderedDict的OrderedDict和在YAML问题中存储数据

问题描述 投票:-1回答:2

所以基本上我有一个我正在制作的应用程序,它有用户数据,我想在数据库中备份和加载。我将数据存储在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-3.x yaml pyyaml
2个回答
0
投票

基本上,你的问题是对有序字典在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建议,但我不想改变太多。


0
投票

每个帖子使用普通的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()]
© www.soinside.com 2019 - 2024. All rights reserved.