django之多表操作

一、表与表之间的关系

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

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

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

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

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

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

         B能不能有多个A

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

    add()        # 添加

    set()      #   修改

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

    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)

猜你喜欢

转载自www.cnblogs.com/qingqinxu/p/11260497.html