django和flask中的一对一、一对多、多对多关系的模型类设计
一、Django:
一对一:
在任意一张表中定义一个字段,models.OneToOneField定义:
# 比如用户与身份证表:一个用户只能有一张身份证,一张身份证只能属于一个用户 class User(models.Model): user = models.CharField(max_length=10)
..... class IdCard(models.Model): card_num = models.CharField(max_length=20)
.... user = models.OneToOneField(User,on_delete=models.CASCADE)
一对多:
在多的类中定义一个字段,models.ForeignKey定义:
# 比如用户与订单表:一个用户可以下很多订单,一笔订单只能属于一个客户 class User(models.Model): user = models.CharField(max_length=10) ...... class Order(models.Model): pay_method = models.SmallIntegerField(choices=PAY_METHOD_CHOICES, default=3, verbose_name='支付方式') ...... user = models.ForeignKey(User, verbose_name='用户', on_delete=models.CASCADE)
多对多:
建立一个新表,分别写两个表的外键,models.ForeignKey定义:
# 比如用户与权限表:一个用户可以有多个权限,一个权限可以归多个用户所有 class User(models.Model): user = models.CharField(max_length=10) ...... class Acction(models.Model): caption = models.CharField(max_length=10) ...... class UserToAcction(models.Model): u = models.ForeignKey(User,on_delete=models.CASCADE) a = models.ForeignKey(Acction,on_delete=models.CASCADE)
二、Flask(别忘了需要设置id字段)
一对一:
在任意一张表中用db.relationship定义(参数加上uselist=False),另一张表中用db.ForeignKey定义
# 比如用户与身份证表 class User(db.Model): id = db.Column(db.Integer, primary_key=True) user = db.Column(db.String(10)) card = card= db.relationship('IdCard',uselist=False,backref=‘user’) ...... class IdCard(db.Model): id = db.Column(db.Integer, primary_key=True) card_num = db.Column(db.String(200)) ..... user_id = db.Column(db.Integer,db.ForeignKey('user.id')) # user是User类对应的数据库表名
一对多:
在一类中用db.relationship定义,多类中用db.ForeignKey定义
# 比如用户与订单表:一个用户可以下很多订单,一笔订单只能属于一个客户 class User(db.Model): id = db.Column(db.Integer, primary_key=True) user = db.Column(db.String(10)) order = db.relationship('Order', backref='area') ...... class Order(db.Model): id = db.Column(db.Integer, primary_key=True) status = db.Column(choices=db.Enum( 'WAIT_ACCEPT', # 待接单 'WAIT_PAYMENT', # 待支付 'PAID', # 已支付 'WAIT_COMMENT', #待评价 'COMPLETE', # 已完成 'CANCELED', #已取消 'REJECTED' # 已拒单 ), default='WAIT_ACCEPT',index=True) ...... user_id = db.Column(db.Integer, db.ForeignKey('user.id')) # user是User类对应数据库的表名
多对多,如下:
# 比如用户与权限表:一个用户可以有多个权限,一个权限可以归多个用户所有 class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(32), unique=True, nullable=False) actions = db.relationship('Acction', secondary=user_acction) ...... class Acction(db.Model): __tablename__ = 'action' id = db.Column(db.Integer, primary_key=True) caption = de.Column(db.String(10)) ...... user_acction = db.Table( "user_acction", # 新表的表名 db.Column("user_id", db.Integer, db.ForeignKey("user.id"), primary_key=True), db.Column("acction_id", db.Integer, db.ForeignKey("acction.id"), primary_key=True) )