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
    #一对多和多对多在这里用法没区别
时间: 2024-07-30 01:54:18

Django的Models(二)映射关系的相关文章

SSH-Hibernate(二)—映射关系(中)

Hibernate的上篇博客写了一对一关联,这篇我们说一下一对多关联.入门篇里我们说过,Hibernate的关联关系对应的是关系型数据库中的表记录之间的关系.换句话说就是以类间的关联关系,来保存或者说映射记录的关系,因为关联关系里的一对一,一对多,多对多描述的是对象(对象即记录)数量的关系.记住这一点应该是有助于理解的. 表关系图 这张图表达的是:客户表和订单表中的记录,一个客户(即一个Customers)对应多个订单(Orders).但是一个订单记录只能对应一个客户. 类图 从这个表关系转化到

【python】-- Django路由系统(网址关系映射)、视图、模板

Django路由系统(网址关系映射).视图.模板 一.路由系统(网址关系映射) 1.单一路由对应: 一个url对应一个视图函数(类) urls.py: url(r'^test', views.test), #url(r'^home', views.Test.as_view()), views.py: def test(request): print(request.method) return render(request, "home.html") """

django Models与数据库关系

在对django的models数据更改之后做迁移时,出现了更改记录缺失,每次更改的时候总是会将表中已存在的字段重新添加到记录中,迁移数据库就会出现错误 解决办法就是将models与表完全脱离, 在models中的表配置以下属性 class Meta: managed = False db_table =tablename 操作流程: 先更改表的配置,然后更改models,保持两者一致,在进行数据库迁移 python manage.py makemigrations python manage.p

Hibernate的七种映射关系之七种关联映射(二)

继续上篇博客 七.Hibernate双向一对多关联映射:让多的一端来维护关系. 主要是解决一对多单向关联的缺陷,而不是需求驱动的. 1.在Student.java实体类里添加Classes引用.private Classes classes; 2.Student.hbm.xml里添加many-to-one标签:<many-to-one name="classes" column="classesid"/>.Classes.hbm.xml在例子(六)里的那

Django开发之路 二(django的models表查询)

django的models表查询 一.单表查询 (1) all(): 查询所有结果 # 返回的QuerySet类型 (2) filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 #返回的QuerySet类型 (3) get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个, #返回的models对象 如果符合筛选条件的对象超过一个或者没有都会抛出错误. (4) exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 #返回的Query

django模型models.py文件内容理解

首先,要理解这句话:模型是你的数据的唯一的.权威的信息源.它包含你所存储数据的必要字段和行为.通常,每个模型对应数据库中唯一的一张表 基础:每个模型都是django.db.models.Model的一个python子类 模型的每个属性都表示为数据库中的一个字段 django提供一套自动生成的用于数据库访问的API,下一章总结 1.第一个例子 from django.db import models class Person(models.Model): first_name = models.C

web框架-(七)Django补充---models进阶操作及modelform操作

通过之前的课程我们可以对于Django的models进行简单的操作,今天了解下进阶操作和modelform: 1. Models进阶操作 1.1 字段操作 AutoField(Field) - int自增列,必须填入参数 primary_key=True AutoField(int自增列) BigAutoField(AutoField) - bigint自增列,必须填入参数 primary_key=True BigAutoField 注:当model中如果没有自增列,则自动会创建一个列名为id的

八、Django之Models(译)

本文为翻译的官方文档,原文地址为:https://docs.djangoproject.com/en/1.11/topics/db/models/.学习工具的最佳地方-官网. model是唯一且明确的数据源.它包含了我们储存的数据的基本字段和方法.通常,每个模型映射到一张数据表. 基本概念: 每个模型都是django.db.models.Model的一个子类 每个属性代表数据库中的一个字段 在这些基础上,Django为我们提供了一个自动生成的数据库访问API. 简单示例 下面的示例模型定义了一个

DJango周总结二:模型层,单表,多表操作,连表操作,数据库操作,事务

django周复习二 1,模型层:  1单表操作:   13个必会操作总结    返回QuerySet对象的方法有    all()    filter()    exclude()    order_by()    reverse()    distinct()    特殊的QuerySet    values()       返回一个可迭代的字典序列    values_list() 返回一个可迭代的元祖序列    返回具体对象的    get()    first()    last()