在manage.py shell中迭代Django类对象?
我试图在models.py中遍历Django类对象,以便根据另一个数据库中存储的信息创建与每个类对象相关的饼图 在命令提示符下运行shell,输入:在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文件;然而,看起来这些图是一个接一个
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的交互式版本会创建许多不希望的结果服务器冻结等,因为在这种情况下不应该使用它。所以我不建议这样做。