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

转载于:https://www.cnblogs.com/evilliu/p/5917006.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值