• django 表结构


                        django 表结构

    一:查看orm写的sq语句:如果对某个语句不清楚的话可以调用queryset的的query方法来查看sql。

    1 obj=Hostinfo.objects.filter(id=val).values(id)
    2 print(obj.query)

    dbsqlite在创建的时候,系统自动创建了一些表和数据库:

    其中我们比较熟悉的django_session 储存用户session的表。

    二:修改表结构

    django的orm和sqlalchemy的区别:

    前者可以不借助第三方的插件进行修改表结构,而sqlachemy需要借助第三方模块才能修改表结构。django修改完之后,需要执行如下命令:

    1、python  manager.py  makemigration

    2、 python  manager.py  makemigrate

    三:django的表结构关系。

    a:多对一。这里和sqlalchemy的区别的是,在sqlalchemy中 是一对多,这里一对多还是多对一,其实就是foreign key的建立在哪个表中。

    在django中,foreign key是建立在“多”的表中。如下:

    一个用户的类型只有一个,一个类型对应多个用户。在django中外键建立在多的关系中。如下:

     1 from django.db import models
     2 
     3 # Create your models here.
     4 class  User(models.Model):
     5     username=models.CharField(max_length=32)
     6     pwd=models.CharField(max_length=32)
     7     user_type=models.ForeignKey('User_type')
     8     
     9 class   User_type(models.Model):
    10     user_type=models.CharField(max_length=32)

     注意:1、如果列的类型是:CharField的话,需要指定字符串的长度。即必须有:max_length参数。

        2、在建立外键的时候如上:user_type=models.ForeignKey('User_type') 参数中 带引号和不带引号,不带引号,下面的"一"的表需要放在“多”的表前面,带引号,则没这个顺序要求。

    b:多对多,ManyToMany 多对多情况。

    多对多情况,在sqlalchemy中需要我们手动创建第三张表,但是在django中默认创建第三张表,也可以我们手动创建第三表。

    比如:抽屉项目中的,新闻表中的点赞,和用户表的关系,一个用户给点赞多个新闻,一个新闻可以被多个用户点赞。

    手动创建第三张表的时候:

    新闻表:

    1 class Title(models.Model):
    2     '''
    3     功能:该函数主要是存储标题以及标题文章的url地址和归属板块。
    4     '''
    5     title=models.CharField(max_length=200)
    6     url=models.CharField(max_length=200)
    7     user=models.ForeignKey('User')
    8     area=models.CharField(max_length=32)#板块。
    9     date=models.CharField(max_length=100,default=time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime(time.time())))

    用户表:

    1 class User(models.Model):
    2     '''
    3     功能:该表主要是存储用户的账号和密码。
    4     '''
    5     user=models.CharField(max_length=32)
    6     pwd=models.CharField(max_length=32)

    第三张点赞表,存储的是新闻表和用户表的ID

    1 class Good(models.Model):
    2     '''
    3     功能:该类是用户的点赞信息表。
    4     '''
    5     # good_count=models.IntegerField()
    6     user=models.ForeignKey('User')
    7     title=models.ForeignKey('Title')

    如果我们不创建第三张表的话,如下:

    class User(models.Model):
        '''
        功能:该表主要是存储用户的账号和密码。
        '''
        user=models.CharField(max_length=32)
        pwd=models.CharField(max_length=32)
    
    class Title(models.Model):
        '''
        功能:该函数主要是存储标题以及标题文章的url地址和归属板块。
        '''
        title=models.CharField(max_length=200)
        url=models.CharField(max_length=200)
        user=models.ForeignKey('User')
        area=models.CharField(max_length=32)#板块。
        date=models.CharField(max_length=100,default=time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime(time.time())))
        good=models.ManyToManyField(User)

    语法是ManyToMany。

    默认第三表的名字是:Title_User.

    c:一对一:比如说:一个系统中含有,管理员用户、超级管理员用户。每当一个用户选择自己用户类型,当选择管理员用户的时候,管理员类型的用户就不存在。即管理员用户只有一个用户,一个用户对应一个管理员用户。也就是说

    目前数据库中只有2种类型的用户类型,当用户类型使用完之后,在插入数据的话,需要创建用户类型。相当于该列加唯一性索引和外键。

    语法用:OnetoOne  在实际数据库中,并不存在一对一的结构。

    1 class  User(models.Model):
    2     username=models.CharField(max_length=32)
    3     pwd=models.CharField(max_length=32)
    4 
    5 class   User_type(models.Model):
    6     user_type=models.OneToOneField('User')
    7     nid=models.AutoField(primary_key=True)
    8     phone_num=models.IntegerField()
    9     phone_num_1=models.IntegerField()
  • 相关阅读:
    xpath语法速查
    负载均衡设计
    Nginx负载均衡配置实例详解
    实现基于DNS的负载均衡
    建立双线服务器(双线游戏服务器)
    python学习
    python多线程概念
    python 多线程就这么简单(续)
    打包一沓开源的 C/C++ 包管理工具送给你!
    讲解开源项目:功能强大的 JS 文件上传库
  • 原文地址:https://www.cnblogs.com/evilliu/p/5917006.html
Copyright © 2020-2023  润新知