在manage.py shell中迭代Django类对象?

时间:2017-02-07 14:47:28

标签: django python-3.x

我试图遍历models.py中的Django Class对象,以便根据存储在另一个db中的信息创建一个与每个Class对象相关的饼图。

在命令提示符下运行shell,我输入:

from file.models import Person, piemaker
    for i in Person.objects.all():
    i.piegraph = i.pgraph()
    i.save()

这样做时,我得到一个饼图作为我的Person类中每个对象的png文件;然而,看起来这些图形是一个在另一个上面而不是作为单个图形弹出。像标签一样重复并且彼此重叠。

我被困在这个被打破的地方,但我的猜测是在我的for循环中?当我只在一个类对象上运行piemaker函数时,它会吐出包含一个漂亮的饼图的正确的png文件。

from file.models import Person, piemaker
    a = Person.objects.get(name='name')
    a.piegraph = a.pgraph()
    a.save()

我一直在研究这两天,但没有用。任何帮助,将不胜感激。

#!python3

###import statements####
from django.db import models
import pandas as pd
import sqlite3
import re
import matplotlib.pyplot as plt

##global start and end variables####
start = '2015-01-01'
end = '2016-01-01'

####fux for making, saving dynamic piegraph file
def piemaker(pietag):
        try:
 ####file to save as####
            filename = 'C:\\users\\user\\PycharmProjects\\Test2\\media_cdn\\pie-' + pietag + start + end+'.png'
        ####file name to return for Django FileField####
        file = 'pie-' + pietag + start + end+'.png'

        ###read my db which is external to Django to get parameters for pie graph
        df = pd.read_sql_query("SELECT * FROM db WHERE " + pietag + " = 1 AND post_date >= '" + str(start) + "' AND post_date <= '" + str(end) + "'", conn)
        df.drop(['sets'], axis=1, inplace=True)
        df = df.astype(int)
        df = df.loc[:, (df !=0).any(axis=0)]

        sums = df.sum()
        sums.sort_values(ascending=False, inplace=True)
        other = 0
        for i in sums[3:]:
            other += i
            sums['other'] = other
        sums.sort_values(ascending=False, inplace=True)
        pie = sums.drop(sums[4:].keys())
        plt.title('Texts/tags associated with ' + pietag + ' between: ' + start + '-' + end)
        plt.pie(pie,labels=pie.keys(), explode= (0,.15,0,0), startangle=90, autopct=make_autopct(pie))
        plt.savefig(filename, bbox_inches='tight')
        return file
    except ValueError:
            return 'nothing here'

class Person(models.Model):


    def __str__(self):
        return self.name

    @property
    def tag(self):
        return self.name.lower().replace(' ', '_')

    def pgraph(self):
        return(piemaker(self.tag))

    name = models.CharField(max_length=50, unique=True)
    tags = models.TextField(default='tag')
    piegraph = models.FileField(null=True, blank=True)

1 个答案:

答案 0 :(得分:0)

我认为您的问题是您正在尝试使用matplotlib的交互式版本。这将导致非常奇怪的结果。相反,您需要使用Figure对象并执行以下操作:

properties