目前我有表history,film,film_region三个表,history包含user_id和film_id代表一个用户看过的电影,film中有film_id和region_id,film_region中有region_id和region_name,用django后端和matplotlib结合,画出一个饼状图,上面统计了一个用户所看过电影地区的比例,请给出代码,要求django中使用原生sql
时间: 2023-06-13 13:06:05 浏览: 90
以下是一个示例代码,它使用原生SQL语句从数据库中获取所需信息,并使用Matplotlib生成饼图。
```python
from django.http import HttpResponse
from django.db import connection
import matplotlib.pyplot as plt
def user_region_pie_chart(request, user_id):
cursor = connection.cursor()
cursor.execute("""
SELECT
film_region.region_name,
COUNT(*) as count
FROM
history
INNER JOIN film ON history.film_id = film.film_id
INNER JOIN film_region ON film.region_id = film_region.region_id
WHERE
history.user_id = %s
GROUP BY
film_region.region_name
""", [user_id])
rows = cursor.fetchall()
labels = [row[0] for row in rows]
counts = [row[1] for row in rows]
plt.pie(
counts,
labels=labels,
autopct='%1.1f%%',
startangle=90
)
plt.axis('equal')
plt.title('User {} Film Region Proportion'.format(user_id))
# Save the image to a file or return as an HTTP response
# plt.savefig('region_pie_chart.png')
# return HttpResponse(open('region_pie_chart.png', 'rb').read(), content_type='image/png')
# Or return the image as an HTTP response directly
from io import BytesIO
buffer = BytesIO()
plt.savefig(buffer, format='png')
buffer.seek(0)
return HttpResponse(buffer.getvalue(), content_type='image/png')
```
该函数接受一个`user_id`参数,根据该参数从数据库中查询出该用户看过的电影地区的数量,然后使用Matplotlib生成饼图,并将图像以HTTP响应的形式返回给客户端。
注意,将图像保存到文件并将其读取并返回作为HTTP响应的另一种方法也包含在该代码中。根据您的需求选择其中一种即可。
阅读全文