$Django 多表操作(增删改查,基于双下划线的查询)

 1 创建多表模型(详情见代码)
  #用了OneToOneFieldForeignKey,模型表的字段,后面会自定加_id

class Zuozhe (models.Model):
id = models.AutoField (primary_key=True)
name = models.CharField (max_length=32)
xiang = models.OneToOneField (to='Xiang', to_field='id')

  # ManyToManyField会自动创建第三张表:格式如下

class Zuozhe (models.Model):
id = models.AutoField (primary_key=True)
class Books (models.Model):
id = models.AutoField (primary_key=True)
name = models.CharField (max_length=32)
price = models.DecimalField (max_digits=5, decimal_places=2)
banse = models.ForeignKey (to=Banse, to_field='id')

zuozhe = models.ManyToManyField (to='Zuozhe')

  # *************重点
  # 一对一的关系:OneToOneField
  # 一对多的关系:ForeignKey
  # 多对多的关系:ManyToManyField
  
 2 添加表记录
  1 一对多新增
   -两种方式:
    -publish=对象
    -publish_id=id

models.Book.objects.create(name='红楼梦',price=34.5,publish_id=1)
publish=models.Publish.objects.get (pk=1)
models.Book.objects.create (name='西游记', price=34.5, publish=publish)

  2 一对多删除:同单表删除 delete()

  3 一对多修改:两种方式,可以传对象,可以传id, update()
  4 一对一跟一对多一样
  5 多对多:
   -add  ----->可以传对象,可以传id,可以传多个

# book=models.Books.objects.filter(name='添加1').first()
# book.zuozhe.add(1,2)


   -remove  ----->可以传对象,可以传id,可以传多个
   -clear  ---->没有参数
   -set   修改 ----->必须传可迭代对象(一般列表),列表里面可以是对象,可以是id (举例:这本书的作者,set([1,2,3] 表里有就不改动了,没有添加,这本书之前的其他作者删除))

book=models.Books.objects.filter(name='添加1').first()
book.zuozhe.set ([3, 2, 1])

 3 基于对象的跨表查询
  1 一对一
   正向:正向查询按字段

   反向:反向查询按表名小写
  2 一对多
   正向:正向查询按字段
   反向:反向按表名小写_set.all()
  3 多对多
   正向:正向查询按字段
   反向查询:反向按表名小写_set.all()
  4******基于对象的查询,多次查询(子查询)
 

总结:  .all()|表名小写_set.all()|按字段  

扫描二维码关注公众号,回复: 4058665 查看本文章


 
 4 基于双下划线的跨表查询 
  -连表查询
  -一对一双下划线查询
   -正向:按字段,跨表可以在filter,也可以在values
   -反向:按表名小写,跨表可以在filter,也可以在values

# models.Books.objects.filter(name__startswith='红').values('zuozhe__xiang__address').filter(zuozhe__xiang__address__startswith='北').values('zuozhe__xiang__sex')


 

猜你喜欢

转载自www.cnblogs.com/3sss-ss-s/p/9954210.html
今日推荐