django5.2 关系映射

django 关系映射

  常见的关系映射有一对一(一张身份证对应一个人)、一对多(一个班级可以有多个学生)、多对多(一个学生报多门课,一门课供多名学生学习)等

  1. 一对一映射:

    1. 语法:OneToOneField(类名,on_delete=xxx)

    2. 创建表:

      class Author(model.Model): ...
      class Wife(model.Model):
            author=models.OneToOneField(Author,on_delete=xxx)  #on_delete表示级联删除,有多个可供选择的参数(models.CASCADE共存亡、models.PROTECT保护模式,不准删)
      
    3. 创建数据:

      1. 无外键的模型类(Author):

        author1 = Author.objects.create(name='王老师')
        
      2. 有外键的模型类(Wife):用外键的字段名/用外键的类属性名。

        wife1 = Wife.objects.create(name='王夫人',author=author1) #"author"是类属性名,关联的是王老师这个obj,即Author的一个实例化的对象
        wife1 = Wife.objects.create(name='王夫人',author_id=1)  #"author_id"是外键字段名,关联的是王老师这个对象的一个主键值
        
    4. 查询数据:有两者其中一个数据,怎么通过这个查找另一个。

      1. 正向查询:直接通过外键属性查询。例如:通过wife找author,

        from .models import wife
        wife = wife.objects.get(name='wangfuren')
        print(wife.name,'的老公是',wife.author.name)
        
      2. 反向查询:没有外键属性的一方,可以调用反向属性查询到关联的另一方,反向关联属性为‘实例对象.引用类名(小写)’,如作假的反向引用为‘作家对象.wife’

        author1 = Author.objects.get(name='wang')
        print(author1.wife.name)   #当反向引用不存在时,就会报错
        
  2. 一对多映射:
      一对多需要明确出具体的角色,在多这个角色的表上设置外键。当一个A类对象可以关联多个B类对象时:

    1. 语法:

      models.ForeignKey('一'对应的模型类,on_delete=xx),必须指明on_delete的模式
      
    2. 创建表:

      class A(model.Model):...
      class B(model.Model):
           属性 =models.ForeignKey("一"对应的模型类,on_delete=xx)
      
    3. 创建数据:先创建‘一’,再创建‘多’。

      from .models import *
      pub1 = Publisher.objects.create(name='清华大学出版社') #无外键的模型类
      book1 = Book.objects.create(title='C++',publisher=pub1) #用外键的类属性名进行关联,关联的是该模型类的一个实例化对象
      book2 = Book.objects.create(title='Java',publisher_id=1) #用外键的字段名进行关联,关联的是外表中该字段的主键的值
      
    4. 查询数据:

      1. 正向查询:
        【通过Book查询Publisher】(写有外键的那个 查 没有外键的那个),例如通过publisher属性进行查询:

        abook = Book.objects.get(id=1)
        print(abook.title,"的出版社是:",abook.publisher.name)
        
      2. 反向查询:
        【通过Publisher查询对应的所有的Book】,需要用到反向属性

        #通过出版社查询对应的书
        pub1 = Publisher.objects.get(name='清华大学出版社')
        book = pub1.book_set.all() #通过book_set获取pub1对应的多个Book数据对象 ;类名(小写)_set
        #books = Book.objects.filter(publisher=pub1) #也可以采用这种方式获取
        print("清华大学出版社的书有:")
        for book in books:
        	print(book.title)
        
  3. 多对多映射:
      mysql中创建多对多需要依赖第三张表来实现,Django中无需手动创建第三张表,Django自动完成。例如一个作者可以出版多本书,一本书可以被多名作者同时编写。

    1. 语法:在关联的两个类中的任意一个类中,添加:属性=models.ManyToManyField(MyModel)

    2. 创建表:

      class Author(models.Model):...
      class Book(models.Model):
           authors = models.ManyToManyField(Author)
      
    3. 创建数据:

      1. 方案1:先创建author,再关联book;

        author1 = Author.objects.create(name='吕老师')
        author2 = Author.objects.create(name='王老师')
        #吕老师和王老师同时写了一本书Python
        book1 = author1.book_set.create(title="Python") #用Author的反向属性创建Book对象,相当于创建了一本书,同时和author1绑定起来,(相当于先创建了一本书,再绑上)
        author2.book_set.add(book1) #相当于已经有了一本书,直接绑定
        
      2. 方案2:先创建book,再关联author

        book = Book.objects.create(title="Django")
        #kevin和吕老师都参与了Django这本书的创作
        author3 = book.authors.create(name = 'kevin') #authors是Book中的多对多属性,这相当于创建了一个author,再和书进行绑定
        book.authors.add(author1) #这相当于已经有了这本书,再和作者绑定
        
    4. 查询数据:

      1. 正向查询:
        有多对多属性的对象查另一方,也就是通过Book查询对应的所有的Author,此时多对多属性等价于objects。

        book.authors.all() 是获取book对应的所有的author的信息
        book.authors.filter(age__lt=80) 是获取book对应的作者中年龄小于80的作者的信息
        
      2. 反向查询:
        通过Author查询对应的所有的Book,利用反向属性book_set

        author.book_set.all()
        author.book_set.filter()
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django 中,可以使用映射文件(mapping file)将 URL 映射到视图函数上。常用的映射文件是 urls.py 文件。 一般来说,一个 Django 项目中会有多个应用程序(app),每个应用程序都有自己的 urls.py 文件。在项目的主 urls.py 文件中,可以通过 include() 函数引入应用程序的 urls.py 文件。 例如,假设我们有一个应用程序叫做 blog,其中定义了一个名为 post_detail 的视图函数。在 blog 应用程序的 urls.py 文件中,可以这样定义: ```python from django.urls import path from .views import post_detail urlpatterns = [ path('post/<int:pk>/', post_detail, name='post_detail'), ] ``` 在项目的主 urls.py 文件中,可以通过 include() 函数引入 blog 应用程序的 urls.py 文件,并将其与一个 URL 前缀(如 /blog/)关联起来: ```python from django.urls import include, path urlpatterns = [ path('blog/', include('blog.urls')), # ... ] ``` 这样,当用户访问 /blog/post/1/ 时,Django 就会将该 URL 映射到 blog 应用程序中的 post_detail 视图函数上。其中,1 是 post 的主键值。 除了使用 path() 函数,还可以使用 re_path() 函数来支持正则表达式匹配。例如,可以在 blog 应用程序的 urls.py 文件中定义一个名为 archive 的视图函数,并将其与 /archive/ 或 /archive/2022/ 这样的 URL 关联起来: ```python from django.urls import re_path from .views import archive urlpatterns = [ re_path(r'^archive/$', archive), re_path(r'^archive/(?P<year>[0-9]{4})/$', archive), ] ``` 在项目的主 urls.py 文件中,可以通过 include() 函数引入 blog 应用程序的 urls.py 文件,并将其与一个 URL 前缀(如 /blog/)关联起来: ```python from django.urls import include, path urlpatterns = [ path('blog/', include('blog.urls')), # ... ] ``` 这样,当用户访问 /blog/archive/ 或 /blog/archive/2022/ 时,Django 就会将该 URL 映射到 blog 应用程序中的 archive 视图函数上。其中,2022 是年份值,可以在视图函数中通过 year 参数获取。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值