MST

星途 面试题库

面试题:Python的Flask和Django框架下复杂数据库查询实现

假设在一个Flask或Django项目中,有一个用户表和订单表,用户表包含用户ID、姓名等字段,订单表包含订单ID、用户ID、订单金额等字段。要求使用框架的数据库操作方式,查询出每个用户的总订单金额,并按照总金额从高到低排序,描述实现思路并给出核心代码片段。
25.3万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

Flask实现思路

  1. 定义数据库模型,分别创建用户表和订单表模型类,通过外键关联用户ID。
  2. 使用SQLAlchemy(Flask常用数据库操作库)进行查询,通过关联查询计算每个用户的总订单金额,然后进行排序。

Flask核心代码片段

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] ='sqlite:///test.db'
db = SQLAlchemy(app)


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    orders = db.relationship('Order', backref='user', lazy='dynamic')


class Order(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    amount = db.Column(db.Float)


# 查询每个用户的总订单金额并按总金额从高到低排序
result = db.session.query(User.name, db.func.sum(Order.amount)). \
    join(Order). \
    group_by(User.id). \
    order_by(db.func.sum(Order.amount).desc()). \
    all()

for user_name, total_amount in result:
    print(f"用户 {user_name} 的总订单金额: {total_amount}")

Django实现思路

  1. 在Django项目的应用中定义用户表和订单表的模型类,通过外键关联用户ID。
  2. 使用Django的ORM进行查询,通过关联查询计算每个用户的总订单金额,然后进行排序。

Django核心代码片段

from django.db import models
from django.db.models import Sum


class User(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=50)


class Order(models.Model):
    id = models.AutoField(primary_key=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    amount = models.FloatField()


# 查询每个用户的总订单金额并按总金额从高到低排序
result = User.objects.annotate(total_amount=Sum('order__amount')).order_by('-total_amount')

for user in result:
    print(f"用户 {user.name} 的总订单金额: {user.total_amount}")