Django的Models(二)映射关系详解大数据

关系分为三种:

  一对一 :user2 = models.OneToOneField(“UserInfo”)

  一对多:user = models.ForeignKey(“UserInfo”) 

  多对多:user3 = models.ManyToManyField(“UserInfo”)

    或者创建关系表,添加两个外键,记得加个联合索引


#一对多(ForeignKey): 
 
    #方式一: 由于绑定一对多的字段,比如publish,存到数据库中的字段名叫publish_id,所以我们可以直接给这个 
    #       字段设定对应值: 
           Book.objects.create(title='php', 
                               publisher_id=2,   #这里的2是指为该book对象绑定了Publisher表中id=2的行对象 
                               publication_date='2017-7-7', 
                               price=99) 
 
 
    #方式二: 
    #       <1> 先获取要绑定的Publisher对象: 
        pub_obj=Publisher(name='河大出版社',address='保定',city='保定', 
                state_province='河北',country='China',website='http://www.hbu.com') 
    OR  pub_obj=Publisher.objects.get(id=1) 
 
    #       <2>将 publisher_id=2 改为  publisher=pub_obj 
 
#多对多(ManyToManyField()): 
 
    author1=Author.objects.get(id=1) 
    author2=Author.objects.filter(name='alvin')[0] 
    book=Book.objects.get(id=1) 
    book.authors.add(author1,author2) 
    #等同于: 
    book.authors.add(*[author1,author2]) 
    book.authors.remove(*[author1,author2]) 
    #------------------- 
    book=models.Book.objects.filter(id__gt=1) 
    authors=models.Author.objects.filter(id=1)[0] 
    authors.book_set.add(*book) 
    authors.book_set.remove(*book) 
    #------------------- 
    book.authors.add(1) 
    book.authors.remove(1) 
    authors.book_set.add(1) 
    authors.book_set.remove(1) 
 
#注意: 如果第三张表是通过models.ManyToManyField()自动创建的,那么绑定关系只有上面一种方式 
#     如果第三张表是自己创建的: 
     class Book2Author(models.Model): 
            author=models.ForeignKey("Author") 
            Book=  models.ForeignKey("Book") 
#     那么就还有一种方式: 
            author_obj=models.Author.objects.filter(id=2)[0] 
            book_obj  =models.Book.objects.filter(id=3)[0] 
 
            s=models.Book2Author.objects.create(author_id=1,Book=book_obj) 
 
            s=models.Book2Author(author=author_obj,Book_id=1) 
            s.save()

 1 #正向 
 2 book = models.Book.objects.filter(id=1).first() 
 3 #这里不能使QuerySet的对象 
 4 #删除第三张表中和女孩1关联的所有关联信息 
 5 book.author.clear()        #清空与book中id=1 关联的所有数据 
 6 book.author.remove(2)  #可以为id 
 7 book.author.remove(*[1,2,3,4])     #可以为列表,前面加* 
 8  
 9 #反向 
10 author = models.Author.objects.filter(id=1)[0] 
11 author.book_set.clear() #清空与boy中id=1 关联的所有数据

obj=Book.objects.filter(id=1)[0] 
    author=Author.objects.filter(id__gt=2) 
 
    obj.author.clear() 
    obj.author.add(*author)

#--------------------对象形式的查找-------------------------- 
    # 正向查找 
    ret1=models.Book.objects.first() 
    print(ret1.title) 
    print(ret1.price) 
    print(ret1.publisher) 
    print(ret1.publisher.name)  #因为一对多的关系所以ret1.publisher是一个对象,而不是一个queryset集合 
 
    # 反向查找 
    ret2=models.Publish.objects.last() 
    print(ret2.name) 
    print(ret2.city) 
    #如何拿到与它绑定的Book对象呢? 
    print(ret2.book_set.all()) #ret2.book_set是一个queryset集合 
 
#---------------了不起的双下划线(__)之单表条件查询---------------- 
 
#    models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值 
# 
#    models.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据 
#    models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in 
# 
#    models.Tb1.objects.filter(name__contains="ven") 
#    models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感 
# 
#    models.Tb1.objects.filter(id__range=[1, 2])   # 范围bettwen and 
# 
#    startswith,istartswith, endswith, iendswith, 
 
#----------------了不起的双下划线(__)之多表条件关联查询--------------- 
 
# 正向查找(条件) 
 
#     ret3=models.Book.objects.filter(title='Python').values('id') 
#     print(ret3)#[{'id': 1}] 
 
      #正向查找(条件)之一对多 
 
      ret4=models.Book.objects.filter(title='Python').values('publisher__city') 
      print(ret4)  #[{'publisher__city': '北京'}] 
 
      #正向查找(条件)之多对多 
      ret5=models.Book.objects.filter(title='Python').values('author__name') 
      print(ret5) 
      ret6=models.Book.objects.filter(author__name="alex").values('title') 
      print(ret6) 
 
      #注意 
      #正向查找的publisher__city或者author__name中的publisher,author是book表中绑定的字段 
      #一对多和多对多在这里用法没区别 
 
# 反向查找(条件) 
 
    #反向查找之一对多: 
    ret8=models.Publisher.objects.filter(book__title='Python').values('name') 
    print(ret8)#[{'name': '人大出版社'}]  注意,book__title中的book就是Publisher的关联表名 
 
    ret9=models.Publisher.objects.filter(book__title='Python').values('book__authors') 
    print(ret9)#[{'book__authors': 1}, {'book__authors': 2}] 
 
    #反向查找之多对多: 
    ret10=models.Author.objects.filter(book__title='Python').values('name') 
    print(ret10)#[{'name': 'alex'}, {'name': 'alvin'}] 
 
    #注意 
    #正向查找的book__title中的book是表名Book 
    #一对多和多对多在这里用法没区别

 

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/bigdata/9252.html

(0)
上一篇 2021年7月19日 09:19
下一篇 2021年7月19日 09:19

相关推荐

发表回复

登录后才能评论