码迷,mamicode.com
首页 > 其他好文 > 详细

django之多表操作

时间:2019-07-28 19:25:17      阅读:95      评论:0      收藏:0      [点我收藏+]

标签:max   author   nbsp   sed   ace   models   varchar   地址   key   

一、表与表之间的关系

  一对一:(OneToOneField)  关系字段无论建在哪张表里都可以,但是推荐建在查询频率比较高的那张表 

      【publish = models.ForeignKey(to=‘Publish‘)】

  一对多:(ForeignKey)   一对多字段建在多的那一方

  多对多:(ManyToManyField)    多对多字段无论建在哪张关系表里都可以,但是推荐建在查询频率比较高的那张表

  ps: 如何判断表与表之间到底什么关系

    换位思考:A能不能有多个B

         B能不能有多个A

     增改删:可以是数字,也可以是对象

    add()        # 添加

    set()      #   修改

    remove()    #不能接收可迭代对象,可以* querySet对象

    clear()      #  清空 不用传参

  删中设置级联删除:

    publish = models.ForeignKey(to=‘Publish‘, on_delete=models.CASCADE)
    publish = models.ForeignKey(to=‘Publish‘, on_delete=models.SET_NULL, null=True)  # 取消级联删除一定要设置null=True
    
    CASCADE: 设置级联删除,即删除了出版社,对应的该出版社的书也会一块删除
    SET_NULL: 取消级联删除

正向与反向的概念

models:

技术图片
class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8, decimal_places=2)
    publist_date = models.DateField(auto_now_add=True)
    # publish = models.ForeignKey(to=‘Publish‘, to_field=‘id‘, on_delete=models.CASCADE,)
    publish = models.ForeignKey(to=Publish, on_delete=models.SET_NULL, null=True)
    authors = models.ManyToManyField(to=Author)  # 虚拟字段

class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=32)
    email = models.EmailField()  # 对应就是varchar类型

class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    authordetail = models.OneToOneField(to=AuthorDetail)

class AuthorDetail(models.Model):
    phone = models.CharField(max_length=32)
    addr = models.CharField(max_length=32)
View Code


正向查询按字段,反向查询按表名小写...

一对一
  正向:author---关联字段在author表里--->authordetail 按字段
   反向:authordetail---关联字段在author表里--->author 按表名小写
     查询jason作者的手机号 正向查询
     查询地址是 :山东 的作者名字 反向查询

一对多
  正向:book---关联字段在book表里--->publish 按字段
  反向:publish---关联字段在book表里--->book 按表名小写_set.all() 因为一个出版社对应着多个图书

多对多
  正向:book---关联字段在book表里--->author 按字段
  反向:author---关联字段在book表里--->book 按表名小写_set.all() 因为一个作者对应着多个图书


查询出版社是东方出版社出版的书籍 一对多字段的反向查询
  publish_obj = models.Publish.objects.filter(name=‘东方出版社‘).first()
  print(publish_obj.book_set) # app01.Book.None
  print(publish_obj.book_set.all())

查询作者jason写过的所有的书 多对多字段的反向查询
  author_obj = models.Author.objects.filter(name=‘jason‘).first()
  print(author_obj.book_set) # app01.Book.None
  print(author_obj.book_set.all())

查询作者电话号码是110的作者姓名 一对一字段的反向查询
  authordetail_obj = models.AuthorDetail.objects.filter(phone=110).first()
  print(authordetail_obj.author.name)

django之多表操作

标签:max   author   nbsp   sed   ace   models   varchar   地址   key   

原文地址:https://www.cnblogs.com/qingqinxu/p/11260497.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!