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 所建议的那样使用列表推导式从已排序的列表构建此列表,但我不想更改太多。
所以基本上我有一个正在制作的应用程序,其中包含我想要备份并加载到数据库中的用户数据。我将数据存储在 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 所建议的那样使用列表推导式从已排序的列表构建此列表,但我不想更改太多。