zoukankan      html  css  js  c++  java
  • 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)
    )
  • 相关阅读:
    洛谷P2045 K方格取数(算竞进阶习题)
    洛谷P2764 最小路径覆盖问题
    BZOJ 1051 受欢迎的牛
    BZOJ 4196 软件包管理器
    跨域知识(一)——CORS
    CSS 实现隐藏滚动条同时又可以滚动
    数组map用法总结
    js和Jquery获取选中select值和文本
    closest和parents方法区别
    CSS面试题总结2(转)
  • 原文地址:https://www.cnblogs.com/zzmx0/p/13499309.html
Copyright © 2011-2022 走看看