【问题标题】:how do i create a dictionary within a nested for loop for django database query? [closed]如何在 django 数据库查询的嵌套 for 循环中创建字典? [关闭]
【发布时间】:2013-06-24 20:46:53
【问题描述】:

我有以下代码;

views.py

def render_blog_topics(request, topic):
    
    categories = get_list_or_404(Category, name=topic)
    
    """for category in categories:
        for topic in category.topics.all():
            topic_posts += Post.objects.all().filter(topic = topic).order_by('topic')
            print Post.objects.all().filter(topic = topic).order_by('topic').query
            print topic_posts"""
    all_data = []
    all_topics = Topic.objects.all()
    def loop_topic():
        for topic in all_topics:
            current_data = {}
            current_posts = []
            current_posts.append(Post.objects.filter(Q(topic=topic))) 
            # append more posts based on query here like Q(categorie__topic = each_topic) or something
        current_data['topic'] = topic
        current_data['posts'] = current_posts
        all_data.append(current_data)      
    
    category_posts = Post.objects.filter(category= loop_topic())
    
    print Post.objects.filter(category= loop_topic())                

    data = {
            'categories': categories,
            'TopicsForm': TopicsForm(),
            'all_data' : all_data
             
            }
    print all_data 
    
    return render(request, 'blog_topics.html',data)

data var 已经包含的内容基本上用于关于导航元素和网站其他部分的标签。

我想要完成的是每个主题

        for category in categories:
        for topic in category.topics.all():
            print topic

我想根据当前循环中的主题获取所有帖子,并让它构建一个我可以放入数据中的变量。

例如

Topic1 ---> 所有与topic1相关的帖子 Topic2 ---> 所有与topic2相关的帖子 .....等等等等第四个

我如何构建一个单独的变量来保存主题以及与之关联的所有帖子,以便我可以在模板中循环遍历它;

{% for each topic %}
{% for each post in topic %}

{{ obj.title }}

{% endfor %}
{% endfor %}

(只是试图传达我想要做的事情的逻辑)。

解决方案

模板.py

             {% for each_item in all_data %}
             <div id="{{ each_item.topic }}" class="content_list">
             <a class="title" href="">{{ each_item.topic }}</a>
                <div class="list_container">
                    <ul>
                     {% for posts in each_item.posts %}
                        {% for post in posts %}
                        <li class="python">
                            <a href="">{{ post.title }}<br/> 
                            <span class="date_comments">{{ post.date_created }} | 
                            <span class="comments">12</span></span></a>
                        </li>
                         {% endfor %}
                     {% endfor %}
                    </ul>
                </div>                       
             </div>
             {% endfor %}

views.py

    categories = get_list_or_404(Category, name=topic)           
all_data = []
all_topics = Topic.objects.all()
category_posts = Post.objects.filter(category = categories[0])
print category_posts
for each_topic in all_topics:
    current_data = {}
    current_posts = []
    current_posts.append(category_posts.filter(Q(topic=each_topic))) 
    # append more posts based on query here like Q(categorie__topic = each_topic) or something
    current_data['topic'] = each_topic
    current_data['posts'] = current_posts
    all_data.append(current_data) 
data = {
        'categories': categories,
        'TopicsForm': TopicsForm(),
        'all_data' : all_data
         
        } 

谢谢

【问题讨论】:

    标签: python django


    【解决方案1】:

    试试这个方法...

    all_data = []
    all_topics = Topic.objects.all()
    categorie_posts = Post.objects.filter(categorie=categories)
    for each_topic in all_topics:
        current_data = {}
        current_posts = []
        current_posts.append(categorie_posts.filter(Q(topic=each_topic)) 
        # append more posts based on query here like Q(categorie__topic = each_topic) or something
        current_data['topic']=each_topic
        current_data['posts'] = current_posts
        all_data.append(current_data)
    

    现在在模板中

     {% for each_item in all_data %}
         {% each_item.topic %}
         {% for each_post in each_item.posts %}
             {% each_post.title %}
             {% each_post.content %}
         {% endfor %}
     {% endfor %}
    

    【讨论】:

    • H]i,这似乎引导我朝着正确的方向前进。然而,我遇到了一些问题。 for 循环出现缩进错误,因此为了尝试修复我将所有 for 循环逻辑放入函数 loop_topic(),然后调用 category_posts = Post.objects.filter(category= loop_topic())。在我的数据库中,我有 2 个帖子标记为同一主题,但是模板将每个主题呈现为一个单独的项目,我无法使用 each_post.title 等访问其属性。我将在上面编辑我的帖子以包含我所做的按照你的代码
    • 嗨,我认为我上面的代码有错误..我现在修复了..我忘记完成 categorie_posts 查询并使用该变量
    • 嘿,谢谢它的工作方式与您发布的几乎完全一样,但我必须在模板代码中进行一点小改动。帖子 [[]] 中似乎多了一层。这是设计使然吗?因此,您需要多循环一次。
    【解决方案2】:

    我认为你可以这样做。为 ex 声明一个字典和一个列表:-

    topic_dict = {}
    topic_list = []
    

    在你的循环中构建字典,比如

    topic_dict = { 'title': topic['title'], 'author': topic['author'] }
    

    然后在同一个循环中将这个字典附加到一个列表中

    topic_list.append(topic_dict)
    

    所以最后它会给你一个包含字典的列表,你可以在模板内轻松循环。

    【讨论】:

    • 您好,感谢您的回复。对不起,我不太明白。我在上面编辑了我的帖子以显示我将要运行的查询。此查询返回一个查询集,但我在逻辑上难以理解如何构建可以放入现有字典的对象。该查询构建了一个查询集,但我不知道如何将其放置到 dict 中的适当位置以及如何重置变量以便我可以生成下一个主题帖子。标题 + 其他字段作为我理解的查询集的一部分自动生成。
    猜你喜欢
    • 2020-06-14
    • 2020-11-02
    • 1970-01-01
    • 2021-07-25
    • 2019-03-29
    • 2022-01-03
    • 2019-09-30
    • 2022-10-01
    • 2021-12-03
    相关资源
    最近更新 更多