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

OrderedDict of OrderedDict and storing data in YAML Issues

所以基本上我有一个正在制作的应用程序,其中包含我想要备份并加载到数据库中的用户数据。我将数据存储在 yml 文件中。现在,一个用户有 post 个。每个 post 都有一个时间戳、文本和标签。我想使用 ordereddictionary 以便在我将数据写入 YAML 文件时保持顺序。目前,我正在做这样的事情:

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

如您所见,我使用了一组排序规则,我认为这就是我的每个用户的 post 未排序的原因。我该如何解决这个问题。

我要返回此 posts_arr 对象以存储在另一个 ordereddictionary 中。

此外,由于 posts 文本有点嵌套并且是一大块文本,我想确保文本也以字符串文字块样式存储。

对每个 post 使用普通的 dict(如果确实需要,也可以使用 OrderedDict),并使用一个列表来收集所有 post。一旦你这样做了,就很容易使用列表理解来直接定义 return 值。

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()]

基本上,您的问题是对有序词典在 python 中的工作方式存在误解。 python 文档指出 OrderedDict 是:

dict subclass that remembers the order entries were added

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 所建议的那样使用列表推导式从已排序的列表构建此列表,但我不想更改太多。