如何从Postgres数据库制作的字典创建Django上下文

时间:2018-02-22 03:36:47

标签: python django postgresql django-models django-views

我是Django的新手。我正在使用Mezzanine 4.2.3(根据requirements.txt引擎盖下的Django 1.10.8)。我有一个关于电影的Postgres数据库。我想在一个页面上显示10部电影。

我试过询问这个method但是无法找到合适的解决方案,所以现在我正在尝试编写自己的SQL查询。但是,我不知道如何创建上下文。

在下面的代码中,我首先从一个国家/地区列表中随机收集十个国家/地区。接下来,我遍历列表并使用每个国家/地区获取Postgres数据库中的一行。然后,我从每一行创建一个字典,并试图为模板创建上下文。

import psycopg2
from psycopg2 import sql
from .countries import countries # Just a Python list of countries
import random

class MoviesListView(generic.ListView):
    model = Movies

    connection = psycopg2.connect([DB DETAILS])
    c = connection.cursor()

    def get_context_data(self, **kwargs):

        random_countries = []
        while len(random_countries) < 10:
            choice = random.choice(countries)
            if choice not in random_countries:
                random_countries.append(choice.lower())
            else:
                pass

        for country in random_countries:

            get_rows = "SELECT * FROM movies WHERE LOWER(production_countries) LIKE %s LIMIT 1;"

            c.execute(get_rows, ('%' + country + '%',))
            rows = c.fetchall()

            for i in rows:
                row_dict = {}
                row_dict['id'] = i[0]
                row_dict['original_title'] = i[3]
                row_dict['release_date'] = i[6]
                row_dict['production_countries'] = i[8]

                # Point at which I'm stuck. 
                # Context().push(row_dict)    
                # return Movies.objects.raw(get_rows, ('%' + country + '%',))

    template_name = r"movies_crud/movies_list.html"

我在Context()上阅读了Django文档,我认为Context().push()Context.update()有助于创建上下文。但它没有成功。

我也试过了.raw()但是它不起作用,因为我试图用for循环动态生成上下文。

在这种情况下我们如何制作Django上下文?

更新:为了了解我正在尝试做什么,模板看起来像这样:

{% for object in object_list %}
    {{ object.title }}
{% endfor %}

它显示10个电影片名。

PS:我在这个问题上工作了16个小时并在提出这个问题之前阅读了我能做的事情。所以,这是一个小问题但是,如果有人在没有留下任何一个字来解释它的情况下放弃一个downvote就不好了。

2 个答案:

答案 0 :(得分:1)

试试这个,

def get_context_data(self, **kwargs):
    random_countries = []
    while len(random_countries) < 10:
        choice = random.choice(countries)
        if choice not in random_countries:
            random_countries.append(choice.lower())
        else:
            pass

    result_list = []  # updated here <<
    for country in random_countries:

        get_rows = "SELECT * FROM movies WHERE LOWER(production_countries) LIKE %s LIMIT 1;"

        c.execute(get_rows, ('%' + country + '%',))
        rows = c.fetchall()

        for i in rows:
            row_dict = {}
            row_dict['id'] = i[0]
            row_dict['original_title'] = i[3]
            row_dict['release_date'] = i[6]
            row_dict['production_countries'] = i[8]
            result_list.append(row_dict)  # updated here <<
    return result_list  # updated here <<


<强>更新
我想{I {{}}}方法在我尝试返回get_context_data()对象时返回dict对象。这可能是发生异常的原因。所以如下更新list

get_context_data()


因此,def get_context_data(self, **kwargs): random_countries = [] while len(random_countries) < 10: choice = random.choice(countries) if choice not in random_countries: random_countries.append(choice.lower()) else: pass result_list = [] for country in random_countries: get_rows = "SELECT * FROM movies WHERE LOWER(production_countries) LIKE %s LIMIT 1;" c.execute(get_rows, ('%' + country + '%',)) rows = c.fetchall() for i in rows: row_dict = {} row_dict['id'] = i[0] row_dict['original_title'] = i[3] row_dict['release_date'] = i[6] row_dict['production_countries'] = i[8] result_list.append(row_dict) return {"result": result_list} # UPDATE IS HERE << 会返回get_context_data(),如下所示,

dict

答案 1 :(得分:1)

我会这样做:我可以通过context()发送行     `

def get_context_data(self, **kwargs):

    random_countries = []
    while len(random_countries) < 10:
        choice = random.choice(countries)
        if choice not in random_countries:
            random_countries.append(choice.lower())
        else:
            pass
    objects_list = []
    for country in random_countries:

        get_rows = "SELECT * FROM movies WHERE LOWER(production_countries) LIKE %s LIMIT 1;"

        c.execute(get_rows, ('%' + country + '%',))
        rows = c.fetchall()

        for row in rows:
            object_list.append(row)
    return { "objects_list":objects_list }

只是一个标记过滤器来获取给定的ID:

from django import template

register = template.Library()

@register.filter
def get(obj,i):
    return obj[i]

在模板中,您可以这样做:

{% for row in objects_list %}
    {% for i in row %}
        <label>id</label> {{i|get:0}}
        <label>original_title</label> {{i|get:3}}
        <label>release_date</label>  {{i|get:6}}
        <label>production_countries</label> {{i|get:8}}
    {% endfor %}
{% endfor %}