Django模型层多表操作

1.创建表模型

'''
(一)多表查询
    一对一:models.OneToOneField(to_field='id',to='Authordatil')
    
    一对多:(外键设置唯一性)
        models.ForeignKey(to='Publish',to_field='id')

    多对多:自动生成第三张表
        models.ManyToManyField(to='Author')

(二)创建表模型
     作者与详情  ( 一对一 )
     书与作者( 多对多 )
     出版社与书(一对多 )

     出版社:id name  add  email
     书: id  name  price  publish

     作者: id  name  sex  authordatil
     详情: id  photo  address

'''

from django.db import models

# Create your models here.

class Publish(models.Model):                        
    id = models.AutoField(primary_key=True)   # 主键
    name = models.CharField(max_length=32)
    address = models.CharField(max_length=64)
    email = models.EmailField()

    def __str__(self):
        return '%s,%s,%s'%(self.name,self.address,self.email)

class Book(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5,decimal_places=2)
    # 出版社与书( 一对多 )外键要设置唯一性,关联的表,关联的字段
    publish = models.ForeignKey(to='Publish',to_field='id')
    # 书与作者( 多对多 )
    authors = models.ManyToManyField(to='Author')

    def __str__(self):
        return self.name

class Author(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)  
    choices = ( (0,"女"),(1,"男") )   
    sex = SmallIntegerField( choices=choices, default=0 )
	# 作者与详情 ( 一对一 )     
	authordatil = models.OneToOneField(to_field='id',to='Authordatil')     
	def __str__(self):       
		return self.name 
class Authordatil(models.Model):   
	id = models.AutoField(primary_key=True)    
	photo = models.CharField(max_length=32)    
	address = models.CharField(max_length=32)


  • id 字段是自动添加的
  • 对于外键字段,Django 会在字段名上添加"_id" 来创建数据库中的列名
  • 外键字段 ForeignKey 有一个 null=True 的设置(它允许外键接受空值 NULL),你可以赋给它空值 None 。

2.添加/删除/修改表记录

  • 批量插入
# 批量插入 bulk_create
li = []
for i in range(100):
    li.append(models.Book(name='图书%s'%i,price=10+i))  # 生成100个对象
models.Book.objects.bulk_create(li)  # 参数为列表,列表里为100个对象,一次插入100条
  • 一对一 增/删/改 数据
# 增
Authordatil = Authordatil.objects.create(photo=121212121,address='东莞') 
# 改
auther = Auther.objects.filter(name = '西游记').update( publish_id=1 )
# 先查   
auther = Auther.objects.filter("name" = "西游记").first() 
auther.name = "东游记"  # 再改
auther.save()  # 最后保存
auther =Auther.objects.filter(name = '西游记').delete()  # 删除

  • 一对多 增/删/改 数据
#增:
# publish_id: 数字
book = Book.objects.create(name='三国',price=56,publish_id=1)
# publish: 对象
publish = Publish.objects.get(id=1)
book = Book.objects.create(name='西游记',price=26,publish=publish)
#改:
# publish_id: 数字
book = Book.objects.filter(name = '西游记').update( publish_id=1 )
# publish: 对象
publish = Publish.objects.get(id=3)
book = Book.objects.filter(name = '西游记').update(publish=publish)

#删:同单表查询一样
book = Book.objects.filter(name='西游记',price=22).delete()
  • 多对多 增/删/改 数据
'''
增:add ( obj1,obj2... )   可以传对象,可以传id,可以传多个
删:remove( obj1,obj2... )  可以传对象,可以传id,可以传多个

改:先清空,配置
清空: clear()  清空所有
配置:set()  里面传列表,里面可以是对象或者是id  *注意先清空,在配置
'''
#(五)多对多新增 (书 与 作者)
zxx = Author.objects.filter(name='zxx').first()
yxx = Author.objects.filter(name='yxx').first()
book = Book.objects.filter(name='西游记').first()
book.authors
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值