Django数据库一对多字段

devtools/2024/9/24 13:01:55/

3.16 Django数据库一对多

一对多关系通常通过外键(ForeignKey)来建立。

示例:

1)创建Author和book models class

class Auther(models.Model):name=models.CharField(verbose_name='作者',max_length=32)class Book(models.Model):    title=models.CharField(verbose_name='书名',max_length=128)auther=models.ForeignKey(verbose_name='作者',to=Auther,related_name='books',on_delete=models.CASCADE)#基本逻辑,一个作者可以有多本书,一本书只能有一个著者
#表book 的auther(作者)字段的类型为Foreignkey,关联到表auther
#related_name='books',用于反射解析时使用,见第三步

2)往表中插入数据

#向auther表中插入一条数据,name为'sally'
models.Auther.objects.create(name='sally')
#获取一个auther对象(name='sally'的作者)
auther_obj=models.Auther.objects.filter(name='sally').first()
#向book表中插入数据,方法一(auther_id=1),使用'字段名_id=id',后面可直接赋予关联表中的实际值(在auther表中,'sall'的ID是1)
models.Book.objects.create(title='sally_book1',auther_id=1)
#向book表中插入数据,方法一(auther=auther_obj),使用’字段名=关联表对象(auther_obj是一个auther表对象)
models.Book.objects.create(title='sally_book2',auther=auther_obj)

插入数据后的表结构如下:

auther表:

idname
1sally

book表:

idtitleauther_id
1sally_book11
2sally_book21

3)查看数据

auther_obj=models.Auther.objects.filter(name='sally').first()
#查询作者为sally的所有书,这里的books,就是在第一步中创建的related_name='books'
print(auther_obj.books.all())#查询作者为sally的名为'sally_book2'的书
print(auther_obj.books.filter(title='sally_book2'))#获取书名为'sally_book1'的对象
book_obj=models.Book.objects.filter(title='sally_book1').first()#跨表查询该书的作者(book_obj.auther是一个auther对象)
print(book_obj.auther.name)
#跨表查询所有书的作者信息('auther'输出的是auther_id,auther输出的是作者姓名)
print(models.Book.objects.all().values_list('auther','auther__name'))

4)通过字段对象获取关联表对象

#获取auther字段对象
field=models.Book._meta.get_field('auther')
#获取auther字段关联的表中的对象(auther字段关联的是auther表,所以获取的是auther表中的对象)
print(field.remote_field.model.objects.all())

http://www.ppmy.cn/devtools/96091.html

相关文章

Java八股整合(MySQL+Redis)

MySQL 数据库设计三范式 不可再分,部分依赖,传递依赖 主键和外键区别 主键非空约束,唯一性约束,唯一标识一个字段 外键用于和其他表建立连接,是另一张表的主键,可重复可为空可以有多个 为什么不推荐使…

百度地图SDK Android版开发 6 显示覆盖物

百度地图SDK Android版开发 6 显示覆盖物 前言地图类中覆盖物的接口覆盖物类Marker示例Polyline示例Polygon示例Arc示例Circle示例Text示例效果图 Marker的更多属性常用属性交互碰撞动画其它属性 折线的更多属性常用属性交互其它 多边形的更多属性常用属性交互其它 Arc的更多属…

Rust 错误处理

Rust 错误处理 Rust 是一种系统编程语言,以其内存安全、高并发和实用性而著称。在 Rust 中,错误处理是一个核心概念,它通过提供 Result 和 Option 类型来鼓励开发者显式地处理可能出现的错误,而不是依赖异常机制。本文将深入探讨 Rust 中的错误处理机制,包括 Result 和 O…

LeetCode //C - 316. Remove Duplicate Letters

316. Remove Duplicate Letters Given a string s, remove duplicate letters so that every letter appears once and only once. You must make sure your result is the smallest in lexicographical order among all possible results. Example 1: Input: s “bcabc”…

动态规划(算法篇)

算法之动态规划 动态规划(dp) 概念: 将递归算法重新写成非递归算法,让后者把那些子问题的答案系统地记录在一个表(dp数组)内,这种方法叫做动态规划通常用于求解具有最优性质的问题(最优子结构&最优子问题),希望找到具有最优…

数据结构队列的单链表实现

1.Queuec.h头文件函数名 #pragma once #include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<assert.h> typedef int QDataType; typedef struct QueueNode {QDataType data;struct QueueNode* next; }QNode; typedef struct Queue {Q…

MySQL中处理JSON数据:大数据分析的新方向,详解与示例

文章目录 1. MySQL中的JSON数据类型2. JSON函数和运算符3. 创建JSON列的表4. 插入JSON数据5. 查询JSON数据6. 复杂查询和聚合7. JSON 数据的索引8. 总结 在当今的大数据时代&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;作为一种轻量级的数据交换格式&a…

【测试用例设计方法】错误猜测法

1.错误推测法的概念 错误推测法就是基于经验和直觉推测程序中所有可能存在的各种错误&#xff0c;有针对性地设计测试用例的方法。 2.错误推断法的基本思想 列举出程序中所有可能有的错误和容易发生错误的特殊情况&#xff0c;根据它们选择测试用例。 3. 错误推测法的应用案例 …