Django和SQL语句的对应参考
查询语句
SQL:
select * from class;
select * from class where id=1;
django:
res = models.Classes.objects.all()
res = models.Classes.objects.filter(id=1).all()
res = models.Classes.objects.values('user','age') #返回的是一个 [{'user':'xx','age':18}]
res = models.Classes.objects.values_list('user','age') #返回的是一个[('xx',18)]
res = models.Classes.objects.first()
增加数据
SQL:
insert into class values(v1,v2,v3...); # 该方式必须保证 插入的数据个数与 表格字段一 一对应
insert into class (name,age) values(v1,v2); # 该方式必须保证 插入的数据个数与 必须与指定的字段一 一对应
insert into class (name,age) values(v1,v2),(v1,v2) # 同时插入多条记录
django:
[a].
res = models.class.objects.create(name='xx',age='11')
[b].
userinfo={
'name':'xx',
'name':'aa'
}
res = models.class.objects.create(**userinfo)
[c].
userinfo = [
models.class(name='xx',age=18),
models.class(name='aa',age=11),
models.class(name='bb',age=12),
models.class(name='cc',age=13),
models.class(name='dd',age=14),
]
models.class.objects.bulk_create(userinfo)
删除
SQL:
delete from class ; #删除所有数据
delete from class where id=2; #指定删除数据
Django:
res = models.Boy2Girl.objects.filter(id=2).delete()
更新
SQL:
update class set 字段名称=新的值,字段名称2=值2; #修改所有记录
update class set 字段名称=新的值,字段名称2=值2 where 条件 ; #修改满足条件的记录
Django:
res = models.class.objects.filter(id=2).update(name='kk')
一对一
models.py
class UserType(models.Model): # 母表
title = models.CharField(max_length=32, null=True)
class Private(models.Model): #子表
salary = models.CharField(max_length=32, null=True)
sp = models.OneToOneField('UUser', null=True) #一对一 唯一联合
views.py:
#从母表查询子表的数据
# 反向查询
res.子表表名小写.子表的字段名
# 从子表查询母表的数据
# 正向查询
res.关联字段.母表的字段名
多对多
models.py:
class Boy(models.Model):
bname = models.CharField(max_length=32)
class Girl(models.MOdel):
gname = models.CharField(max_length=32)
class b2g(models.MOdel):
b = models.ForeignKey("Boy", null=True)
g = models.ForeignKey("Girl", null=True)
class Meta:
### 联合唯一索引
unique_together = [
("b", 'g')
]
### 联合索引:
index_together = [
('b', 'g')
]
views.py:
bulk_create()
添加数据的时候, 两种方式:
bobj = models.Boy.objects.filter(bname='雷俊').first()
gobj = models.Girl.objects.filter(gname='乔碧萝').first()
# models.Boy2Girl.objects.create(b_id=bobj.id, g_id=gobj.id)
models.Boy2Girl.objects.create(b=bobj, g=gobj)
1. 自己写第三张表
查询:
查询和雷俊约会的姑娘
#需求: 查找一下和雷俊约会的姑娘
#1.
res = models.Boy.objects.filter(bname='雷俊').first()
love_list = res.boy2girl_set.all()
for love in love_list:
print(love.g.gname)
#2.
res = models.Boy2Girl.objects.filter(b__bname='雷俊').all()
print(res) ### [obj, obj,....]
for love in res:
print(love.g.gname)
#3.
res = models.Boy2Girl.objects.filter(b__bname='雷俊').values('g__gname').all()
print(res) ### [{}]
2. 不写第三张表, 使用manytomanyfield
models.py:
class Boy(models.Model):
bname = models.CharField(max_length=32, null=True)
g = models.ManyToManyField('Girl', null=True)
class Girl(models.Model):
gname = models.CharField(max_length=32, null=True)
views.py:
res = models.Boy.objects.filter(bname='雷俊').first()
### 添加
# res.g.add(1)
# res.g.add(2,3)
### 删除
# res.g.remove(3)
### 查询
# res = models.Boy.objects.filter(bname='雷俊').first()
# print(res.g.all()) ####
### 清除
res.g.clear() ### 清空所有的记录
推荐:
第一种
因为第二种方式, 字段只能生成两个, 将来扩展的时候, 很不方便
因此还是使用第一种方式