簡體   English   中英

OrderedDict 的 OrderedDict 和在 YAML 問題中存儲數據

[英]OrderedDict of OrderedDict and storing data in YAML Issues

所以基本上我有一個我正在制作的應用程序,其中包含我想要備份和加載到數據庫中的用戶數據。 我將數據存儲在 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 中。

另外,由於帖子文本是嵌套的並且是一大塊文本,我想確保文本也存儲在字符串文字塊樣式中。

對每個帖子使用一個普通的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()]

基本上,您的問題是對有序字典在 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 建議的排序列表中構建此列表,但我不想更改太多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM