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)
)

 

posted @ 2020-08-14 00:24  组装梦想  阅读(275)  评论(0编辑  收藏  举报