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

在manage.py shell中迭代Django类对象?,django,python-3.x,Django,Python 3.x,我试图在models.py中遍历Django类对象,以便根据另一个数据库中存储的信息创建与每个类对象相关的饼图 在命令提示符下运行shell,输入: from file.models import Person, piemaker for i in Person.objects.all(): i.piegraph = i.pgraph() i.save() 这样做的时候,我会得到一个piegraph作为Person类中每个对象的png文件;然而,看起来这些图是一个接一个

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

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

from file.models import Person, piemaker
    for i in Person.objects.all():
    i.piegraph = i.pgraph()
    i.save()
这样做的时候,我会得到一个piegraph作为Person类中每个对象的png文件;然而,看起来这些图是一个接一个地放在一起的,而不是作为一个单独的图出现。相似的标签是重复的,并且相互重叠

我被困在这个坏掉的地方,但我的猜测是在我的for循环中?当我仅在一个类对象上运行piemaker函数时,它会输出正确的png文件,其中包含一个漂亮的piegraph

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)

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

from matplotlib.figure import Figure

def graphic(request):
        # other code goes here
        fig=Figure()
        fig1=fig.add_subplot(1,1,1)
        fig1.pie((pie,labels=pie.keys(), explode= (0,.15,0,0), startangle=90, autopct=make_autopct(pie)))
        fig.savefig(filename)
        return filename

这很有帮助,因为您正确地指出了错误所在,即我使用的是交互式绘图。尽管如此,我还是决定以不同的方式解决这个问题,只需在函数中添加一行即可。添加的行是在plt.savefig…之后添加的,我添加了plt.clf以清除该图,以便在每次迭代中都创建一个新的。根据我的经验,在django中使用matplotlib的交互式版本会创建许多不希望的结果服务器冻结等,因为在这种情况下不应该使用它。所以我不建议这样做。