目前我有表history,film,film_region三个表,history包含user_id和film_id代表一个用户看过的电影,film中有film_id和region_id,film_region中有region_id和region_name,用django后端和matplotlib结合,画出一个饼状图,上面统计了一个用户所看过电影地区的比例,请给出代码
时间: 2023-06-13 12:06:23 浏览: 99
以下是一个可能的实现:
```python
from django.shortcuts import render
from django.db.models import Count
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
import io
def pie_chart(request, user_id):
# 查询该用户看过的电影的地区及其数量
regions = history.objects.filter(user_id=user_id)\
.values('film__region__region_name')\
.annotate(count=Count('film__region__region_name'))\
.order_by()
# 绘制饼状图
fig = Figure(figsize=(6, 6))
ax = fig.add_subplot(111)
labels = [region['film__region__region_name'] for region in regions]
counts = [region['count'] for region in regions]
ax.pie(counts, labels=labels, autopct='%1.1f%%', startangle=90)
ax.axis('equal')
canvas = FigureCanvas(fig)
buf = io.BytesIO()
canvas.print_png(buf)
response = HttpResponse(buf.getvalue(), content_type='image/png')
return response
```
这里假设history、film和film_region已经定义为Django模型类,并且它们之间的关系已经在模型类中设置好。在这个视图函数中,我们首先查询该用户看过的电影的地区及其数量,然后将结果传递给matplotlib,绘制一个饼状图。最后,我们将绘制出来的图像作为PNG格式的二进制数据返回给前端。请注意,这里的user_id是从URL中获取的,因此需要在URL配置中将其作为参数传递给这个视图函数。
阅读全文