您的位置:首页 > 编程语言 > Go语言

Django基础之Model操作

2017-05-27 00:05 537 查看

一、数据库操作

1、创建model表

基本结构:

1 #coding:Utf8
2 from django.db import models
3
4 class userinfo(models.Model):
5     #如果没有models.AutoField,默认会创建一个id的自增列
6     name = models.CharField(max_length=30)
7     email = models.EmailField()
8     memo = models.TextField()


字段解释:

1 # 获取个数
2     #
3     # models.Tb1.objects.filter(name='seven').count()
4     # 大于,小于
5     #
6     # models.Tb1.objects.filter(id__gt=1)              # 获取id大于1的值
7     # models.Tb1.objects.filter(id__lt=10)             # 获取id小于10的值
8     # models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值
9     # in
10     #
11     # models.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据
12     # models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in
13     # contains
14     #
15     # models.Tb1.objects.filter(name__contains="ven")
16     # models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
17     # models.Tb1.objects.exclude(name__icontains="ven")
18     # range
19     #
20     # models.Tb1.objects.filter(id__range=[1, 2])   # 范围bettwen and
21     # 其他类似
22     #
23     # startswith,istartswith, endswith, iendswith,
24     # order by
25     #
26     # models.Tb1.objects.filter(name='seven').order_by('id')    # asc
27     # models.Tb1.objects.filter(name='seven').order_by('-id')   # desc
28     # limit 、offset
29     #
30     # models.Tb1.objects.all()[10:20]
31     # group by
32     from django.db.models import Count, Min, Max, Sum
33     # models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))
34     # SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"


常用方法

二、详解常用字段

models.DateTimeField  日期类型 datetime
参数,
auto_now = True :则每次更新都会更新这个时间
auto_now_add 则只是第一次创建添加,之后的更新不再改变。

1 class UserInfo(models.Model):
2     name = models.CharField(max_length=32)
3     ctime = models.DateTimeField(auto_now=True)
4     uptime = models.DateTimeField(auto_now_add=True)


1 from app01 import models
2 def home(request):
3     models.UserInfo.objects.create(name='yangmv')
4     after = models.UserInfo.objects.all()
5     print after[0].ctime
6     return render(request, 'app01/home.html')


表结构的修改

表结构修改后,原来表中已存在的数据,就会出现结构混乱,makemigrations更新表的时候就会出错
解决方法:
1、新增加的字段,设置允许为空。生成表的时候,之前数据新增加的字段就会为空。(null=True允许数据库中为空,blank=True允许admin后台中为空)
2、新增加的字段,设置一个默认值。生成表的时候,之前的数据新增加字段就会应用这个默认值

1 from django.db import models
2
3 # Create your models here.
4 class UserInfo(models.Model):
5      name = models.CharField(max_length=32)
6      ctime = models.DateTimeField(auto_now=True)
7      uptime = models.DateTimeField(auto_now_add=True)
8      email = models.EmailField(max_length=32,null=True)
9      email1 = models.EmailField(max_length=32,default='rose@qq.com')


执行makemigrations, migrate 后。老数据会自动应用新增加的规则

models.ImageField 图片

models.GenericIPAddressField IP

ip = models.GenericIPAddressField(protocol="ipv4",null=True,blank=True)
img = models.ImageField(null=True,blank=True,upload_to="upload")


常用参数

选择下拉框 choices

1 class UserInfo(models.Model):
2     USER_TYPE_LIST = (
3         (1,'user'),
4 (2,'admin'),
5 )
6     user_type = models.IntegerField(choices=USER_TYPE_LIST,default=1)


2、连表结构

一对多:models.ForeignKey(其他表)

多对多:models.ManyToManyField(其他表)

一对一:models.OneToOneField(其他表)

应用场景:

一对多:当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)
例如:创建用户信息时候,需要选择一个用户类型【普通用户】【金牌用户】【铂金用户】等。

多对多:在某表中创建一行数据是,有一个可以多选的下拉框
例如:创建用户信息,需要为用户指定多个爱好

一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了
例如:原有含10列数据的一张表保存相关信息,经过一段时间之后,10列无法满足需求,需要为原来的表再添加5列数据

一对多:

1 from django.db import models
2
3
4 # Create your models here.
5 class UserType(models.Model):
6     name = models.CharField(max_length=50)
7 class UserInfo(models.Model):
8     username = models.CharField(max_length=50)
9     password = models.CharField(max_length=50)
10     email = models.EmailField()
11     user_type = models.ForeignKey('UserType')


这是UserInfo表,[b]可以通过外键,对应到UserType表的ID[/b]



这是User_Type表的数据





多对多:

1 from django.db import models
2
3
4 # Create your models here.
5 class UserType(models.Model):
6     name = models.CharField(max_length=50)
7 class UserInfo(models.Model):
8     username = models.CharField(max_length=50)
9     password = models.CharField(max_length=50)
10     email = models.EmailField()
11     user_type = models.ForeignKey('UserType')
12 class UserGroup(models.Model):
13     GroupName = models.CharField(max_length=50)
14     user = models.ManyToManyField("UserInfo")


Django model会自动创建第3张关系表,用于对应UserInfo_id 和UserGroup_id

UserInfo表如上所示:

UserGroup表





Django自动生成的对应关系表





userinfo_id = 1 为 Boss,属于1(用户组A)

一对一: (一对多增加了不能重复)

1 from django.db import models
2
3
4 # Create your models here.
5 class UserType(models.Model):
6     name = models.CharField(max_length=50)
7 class UserInfo(models.Model):
8     username = models.CharField(max_length=50)
9     password = models.CharField(max_length=50)
10     email = models.EmailField()
11     user_type = models.ForeignKey('UserType')
12 class UserGroup(models.Model):
13     GroupName = models.CharField(max_length=50)
14     user = models.ManyToManyField("UserInfo")
15 class Admin(models.Model):
16 Address = models.CharField()
17 user_info_address = models.OneToOneField('UserInfo')


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: