Django笔记(十三)一对一,一对多,多对多之间的查询

2021-12-20 12:36:17 浏览数 (1)

目录

  • 一对一
    • 创建实例
    • choice类型如何获取具体值
    • 如何获取一对一另一个表里面的数据
  • 一对多
    • 实体类
    • 一对多代码(自己创建第三个表)
    • 一对多代码(Django给你生成第三个表)
      • 如何操作第三个表
        • 增加
        • 移除
        • 编辑(覆盖)
        • 查询
        • 清空

一对一

创建实例

代码语言:javascript复制
class UserProfile(models.Model):
    user_info = models.OneToOneField('UserInfo',on_delete=models.CASCADE)
    username = models.CharField(max_length=64)
    password = models.CharField(max_length=64)




class UserInfo(models.Model):
    user_type_choice = (
        (0, u'普通用户'),
        (1, u'高级用户'),
    )
    user_type = models.IntegerField(choices=user_type_choice)
    name = models.CharField(max_length=32)
    email = models.CharField(max_length=32)
    address = models.CharField(max_length=128)

先创建UserInfo表,再创建UserProfile表,这个UserProfile表里面有一个字段user_info ,是一对一的字段,也就是这个UserProfile表里面的user_info的字段,所有数据的都不一样,不可能一样,因为是OneToOneField,一对一

choice类型如何获取具体值

字段是choice类型,如何获取到的是对应的值,而不是键

这个表里面的这个字段,数据库保存的是键1或者2

我想查询出来的这个字段是具体的值,如何写

也就是使用下划线,

代码语言:javascript复制
 get_字段名_display()

这样就可以获取具体的值

如何获取一对一另一个表里面的数据

UserInfo是一个表,UserProfile是一个表,并且UserProfile表里面有一个字段是一对一的外键,关联是UserInfo表,那么现在想要使用UserInfo表里面的数据的对象,获取到UserProfile表里面的数据,如何获取

一对多

实体类

代码语言:javascript复制
男孩表
class Boy(models.Model):
    name = models.CharField(max_length=100)


女孩表
class Girl(models.Model):
    name = models.CharField(max_length=100)


相亲表
class xaingqing(models.Model):
    nan = models.ForeignKey('Boy',on_delete=models.CASCADE)
    nv = models.ForeignKey('Girl',on_delete=models.CASCADE)

一对多代码(自己创建第三个表)

有个相亲表都是外键,现在想要获取到和一个男孩相亲的女生有多少个,也就是男生是一个,女生是多个,典型的一对多的关系

代码语言:javascript复制
    # 查询到某一个男生
    obj = Boy.objects.filter(name="小明").first()

    # 因为相亲表里面有个 字段关联的男生表,所以可以根据男生对象_set,
    获取到相亲表对象

    relist = obj.xaingqing_set.all()
    print(relist) 

 #   <QuerySet [<xaingqing: xaingqing 
    object (1)>, <xaingqing: xaingqing object (2)>]>
    
    # SELECT 
    # `myfirst_xaingqing`.`id`, 
    # `myfirst_xaingqing`.`nan_id`, 
    # `myfirst_xaingqing`.`nv_id` 
    # FROM `myfirst_xaingqing` 
    # WHERE `myfirst_xaingqing`.`nan_id` = 1
    print(relist.query)
    
    
    for item in relist:
        # item 代表相亲表里面的每一行数据对象
        print(item.nv.name)

1、搜索条件使用 __ 连接 2、获取值时使用 . 连接

一对多代码(Django给你生成第三个表)

我们有了男孩表,女孩表,之前我们写一个相亲表,让男孩表和女孩表进行关联。现在我们不写第三个表了,但是还想让两个表进行关联,我们可以这样写。(Django给你生成的只有3列

实体类

代码语言:javascript复制
class Boy(models.Model):
    name = models.CharField(max_length=100)
    nvxx = models.ManyToManyField('Girl')
    
    
class Girl(models.Model):
    name = models.CharField(max_length=100)

现在model里面只有两个类,但是在数据库里面却有3个表,另一个关联表是Django给你生成的,就是通过ManyToManyField() 这个

如何操作第三个表

这个Django给生成的第三个表,在model文件里面是没有的,那么我们要如何操作这个表,也就是实现对这个表的增删改查

增加
移除
编辑(覆盖)
查询
清空

0 人点赞