model表模型
# coding=utf8
from django.db import models
# Create your models here.
class Book(models.Model):
title = models.CharField(max_length=64)
price = models.IntegerField()
color = models.CharField(max_length=64)
page_num = models.IntegerField(null=True)
publisher = models.ForeignKey("Publisher") # 一对多关系
# publisher名字可以自己定义
# django会自己加一个_id,自己插入的时候也要加id
author = models.ManyToManyField("Author") # 多对多关系
def __str__(self):
return self.title
class Publisher(models.Model):
name = models.CharField(max_length=64)
city = models.CharField(max_length=63)
def __str__(self):
return self.city
class Author(models.Model):
name = models.CharField(max_length=30)
def __str__(self):
return self.name
创建表
1 创建单表:
这张表和其他表没有关系
2 创建关联表 | 外键
- 一对一
- 一对多 (重点)(ForeignKey)
- 多对多 (重点)(ManyToMany)
一个类对应一张表,类实例出来的对象对应每一行的数据。
增
没有外键时:
方式一: models.Author.objects.create(name='Alvin')
方式二: dic = {"name":"alex","age":"27"}
models.Author.objects.create(**dic)
如果有外键:
一对多:
(1). modles.Book.objects.create(title='python',price=12,publisher_id=2)
#publisher后在加_id,这是django自行实现的 (推荐)
(2). modles.Book.objects.create(title='python',price=12,publish = obj) #object
多对多:
将两者的外键取出来另建第三张表,含有三列: id book_id publisher_id
绑定:add() 取消:remove()
---- 正向查询
book = models.Book.objects.filter(id=2)[0]
authors = models.Author.objects.filter(id__gt=2)
book.author.add(*authors) //因为是序列,所以要加*
//移除 book.author.remove(*authors)
---- 反向查询
author=models.Author.objects.filter(id=2)[0]
books=models.Book.objects.filter(author__gt=2)
author.book_set.add(*books)
//移除 author.book_set.remove(*books)
实例2
* 涉及多对多关系 增加对象
name = request.POST.get('name') # 此处name是一个对象 代表1
cls = request.POST.getlist('cls') # 此处cls是一个列表 代表多
# print(name,cls)
obj = models.Teacher.objects.create(name=name) #创建对象1
obj.cls.add(*cls) # 增加对象关联的班级
* 涉及多对多关系 增加对象
name = request.POST.get('name') # 此处name是一个对象 代表1
cls = request.POST.getlist('cls') # 此处cls是一个列表 代表多
# print(name,cls)
obj = models.Teacher.objects.create(name=name) #创建对象1
obj.cls.add(*cls) # 增加对象关联的班级
1. 查对象的一个属性
obj = models.Classes.objects.all().value('id')
* 重设多的属性
cls_li = request.POST.getlist('cls')
obj = models.Teacher.objects.get(id=nid)
obj.name = name
obj.cls.set(cls_li)
反向查询
#### book_set是一个query_set,当author表里没有book字段时,用book_set来查询book
#### 自己写第三张表
一对一 : 在一对多的基础上,对多的xxx_id上添加一个unique=ture + Foreignkey
多对多 : 利用两个Foreignkey实现
一对多: 对于book只有一个publisher 外键建在多的一方
# 一对多关系
# publisher名字可以自己定义
# django会自己加一个_id,自己插入的时候也要加id
多对多: 外键可以建在两者中任意一个,ManyToMany会自动创建第三张表
删:
Book.objects.filter(id=1).delete()
改:
models.Book.objects.filter(id=3).update(title="PHP")
##sql:
##UPDATE "app01_book" SET "title" = 'PHP' WHERE "app01_book"."id" = 3; args=('PHP', 3)
查:
obj = Book.objects.filter(id=4)[0].values("price")
<1>filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
<2>all(): 查询所有结果
<3>get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
book = models.Book.objects.filter(id=2)[0]
dic = {xx:xx}
book = models.Book.objects.filter(**dic)
authors = models.Author.objects.filter(id__gt=2)
books=models.Book.objects.filter(author__gt=2)
books=models.Author.objects.filter(id=1).book_set
网友评论