ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

flask中的关联关系:一对多

2021-06-06 11:34:00  阅读:187  来源: 互联网

标签:goods cate flask fields db 关联 Integer 一对 id


模型类

from app.extensions import db


# 商品: 商品属于分类
# 分类   分类反向查询商品
class Cate(db.Model):
   __tablename__ = 'tb_cate'
   id = db.Column(db.Integer, primary_key=True, autoincrement=True)
   name = db.Column(db.String(20), unique=True)


class Goods(db.Model):
   __tablename__ = 'tb_goods'
   id = db.Column(db.Integer, primary_key=True, autoincrement=True)
   name = db.Column(db.String(50), unique=True, nullable=False)
   price = db.Column(db.DECIMAL(8, 2), nullable=False)
   sales = db.Column(db.Integer, default=0)
   stock = db.Column(db.Integer, default=0)
   # 表中实际存在 的 外键字段
   cate_id = db.Column(db.Integer, db.ForeignKey('tb_cate.id'))
   # 字段,表中没有,只是体现 分类和商品的 关联关系, 方便后期的关联查询
   cate = db.relationship('Cate', backref='goods')

序列化字段

from flask_restful import fields

goods_fields = {
   # 和模型类的字段名一一对应
   'id': fields.Integer,
   'name': fields.String,
   'price': fields.String,
   'sales': fields.Integer,
   'stock': fields.Integer,
   # 'cate_id': fields.Integer, # 直接序列化 外键字段
   
   # 'cate': fields.String, # 前提是 模型类需要分类模型类 重写 __str__ 方法,返回分类的名字
   
   # 'c_name': fields.String(attribute='cate.name'), # 自定义字段。需要指明序列化解析的字段, 注意: cate 就是 模型类中的 关联字段
   # 'c_id': fields.Integer(attribute='cate.id'),

   # 将商品对应的分类按照 嵌套格式 进行解析
   "cate": fields.Nested({
       'id': fields.Integer,
       'name': fields.String
  })
}

视图

商品

from flask_restful import Resource, reqparse, marshal_with
from .models import Goods
from .fields import goods_fields
from app.extensions import db


class GoodsView(Resource):
   
   # 商品添加:外键当做普通的字段即可
   def post(self):
       parser = reqparse.RequestParser()

       parser.add_argument('name', type=str, location=['form', 'json'], required=True, help='输入合法的商品名')
       parser.add_argument('price', type=float, location=['form', 'json'], required=True, help='输入合法的商品价格')
       parser.add_argument('stock', type=int, location=['form', 'json'], default=0, help='输入合法的库存')
       parser.add_argument('sales', type=int, location=['form', 'json'], default=0, help='输入合法的销量')
       parser.add_argument('cate_id', type=int, location=['form', 'json'], required=True, help='输入合法的分类id')

       args = parser.parse_args()

       goods = Goods(**args)

       db.session.add(goods)
       try:
           db.session.commit()
       except:
           return {'msg': '添加失败'}, 500
       return {'msg': '添加成功'}, 201

   # 查询所有商品,以及对应的分类信息
   @marshal_with(goods_fields)
   def get(self):
       goods = Goods.query.all()
       return goods

分类商品

查询某个分类对应的 商品信息

  • 以商品表为主,通过外键进行过滤查询

class GoodsCateView(Resource):
   
   @marshal_with(goods_fields)
   def get(self):
       parser = reqparse.RequestParser()
       parser.add_argument('cate_id', type=int, location='args', required=True, help='需要合适的分类信息')

       cate_id = parser.parse_args().get('cate_id')

       # 以商品表为主,通过外键进行过滤
       goods = Goods.query.filter_by(cate_id=cate_id).all()

       return goods

路由

api.add_resource(GoodsCateView, '/goods/cate/')  
# http://127.0.0.1:5000/goods/cate/?cate_id=xxx

 

  • 以分类表为主,先查分类对象,再反向查询 对应的商品列表

class CateGoodsView(Resource):
   @marshal_with(goods_fields)
   def get(self, pk):
       # 先通过id,查询分类对象
       cate = Cate.query.get_or_404(pk)
       
       # 通过模型类中的 backref 属性 实现 反向查询
       return cate.goods

路由

api.add_resource(CateGoodsView, '/cate/<int:pk>/goods/')
# http://127.0.0.1:5000/cate/xxx/goods/

 

标签:goods,cate,flask,fields,db,关联,Integer,一对,id
来源: https://www.cnblogs.com/doomqy/p/14854884.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有