字段的使用一对多,多对多,普通字段
1.一对多的基本增删改查操作
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from django.db import models class UserType(models.Model): type_name = models.CharField(max_length=64, unique=True) class UserInfo(models.Model): name = models.CharField(max_length=64, unique=True) ut = models.ForeignKey(to='UserType', on_delete=models.CASCADE)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from django.shortcuts import render # Create your views here. from django.shortcuts import render, HttpResponse from . import models # 2.1一对多基本增删改查 def orm(request): # 1 创建 # 创建数据方法一 # models.UserInfo.objects.create(name='root06', ut_id=1) # models.UserType.objects.create(type_name='飞机') # 创建数据方法二 # obj = models.UserInfo(name='root2.1', ut_id=2) # obj.save() # 创建数据库方法三(传入字典必须在字典前加两个星号) # dic = {'name': 'root3.1', 'ut_id': 2} # models.UserInfo.objects.create(**dic) # 2 删除 # models.UserInfo.objects.all().delete() # 删除所有 # models.UserInfo.objects.filter(name='root02').delete() # 删除指定 # 3 更新 # models.UserInfo.objects.all().update(ut_id=1) # models.UserInfo.objects.filter(name='root03').update(ut_id=3) # 4.查找 # 4.1 正向查找 user_obj.ut.type_name # print(models.UserInfo.objects.get(name='root03').ut.type_name) # root属于谁 # print(models.UserInfo.objects.filter(ut__type_name='水果')) #外键名字 # # 4.2 反向查找 type_obj.userinfo_set.all() # print(models.UserType.objects.get(type_name='电器').userinfo_set.all()) #外键名字 获取所有 print(models.UserType.objects.get(type_name='飞机').userinfo_set.filter(name='root03')) # 外键名下的root return HttpResponse('orm')
直接在主路由配置
from django.contrib import admin from django.urls import path from app01.views import * from app02.views import * from app03.views import * urlpatterns = [ path('admin/', admin.site.urls), path('c1/',orm), path('c2/',orm02), path('c22/',orm022), path('c3/',orm03) ]
2 一对多查找更多操作
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from django.db import models # Create your models here. class UserType(models.Model): user_type_name=models.CharField(max_length=32) def __str__(self): return self.user_type_name class User(models.Model): username=models.CharField(max_length=32) pwd=models.CharField(max_length=64) ut=models.ForeignKey( to='UserType', to_field="id", related_query_name='a', on_delete=models.CASCADE )
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from django.shortcuts import HttpResponse from app02 import models def orm02(request): # 1 正向查找 # #1.1 正向查找user表用户名 # print(models.User.objects.get(username='苹果').username) #1.2正向夸表查找用户类型 # print(models.User.objects.get(username='苹果').ut.user_type_name) #1.3双下划线正向夸表正向查找 # print(models.User.objects.all().values('ut__user_type_name','username')) #2 反向查找 # 2.1【表名_set】,反向查找user表中用户类型为student 的所有用户 # print(models.UserType.objects.get(user_type_name='水果').user_set.all()) #2.2[a__字段名] 反向查找user表中张三在userType表中的类型 # print(models.UserType.objects.filter(a__username='苹果')) #2.3双下划线夸表反向查找 print(models.UserType.objects.all().values('a__username','user_type_name')) return HttpResponse('orm02')
2.2 一对多使用values和values_list结合双下划线跨表查
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def orm022(request): #第一种:values---获取的内部是字典 #1.1 正向查找,使用ForeignKey字段名ut结合双下划线查询 # a=models.User.objects.filter(username='zhangsan').values('username','ut__user_type_name') # print(a) #1.2反向查找,使用ForeignKey的related_query_name='a' 的字段 # a2=models.UserType.objects.all().values('user_type_name','a__username') # print(a2) #第二种values_list 获取的是元祖 #1.1 正向查找,使用ForeignKey字段名ut结合双下划线查询 # stus=models.User.objects.filter(username='苹果').values_list('username','ut__user_type_name') # print(stus) #1.2反向查找,使用ForeignKey的related_query_name='a',的字段 utype=models.UserType.objects.all().values_list('user_type_name','a__username') print(utype) return HttpResponse('orm')
2.3 一对多ForeignKey可选参数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
''' 1.to, # 要进行关联的表名 2.to_field=None, # 要关联的表中的字段名称 3.on_delete=None, # 当删除关联表中的数据时,当前表与其关 联的行的行为 - models.CASCADE # ,删除关联数据,与之关联也删除 - models.DO_NOTHING # ,删除关联数据,引发错误 IntegrityError - models.PROTECT # ,删除关联数据,引发错误 ProtectedError - models.SET_NULL # ,删除关联数据,与之关联的值设置为 null(前提FK字段需要设置为可空) - models.SET_DEFAULT # ,删除关联数据,与之关联的值设置为默 认值(前提FK字段需要设置默认值) - models.SET # ,删除关联数据, 4、related_name=None, # 反向操作时,使用的字段名,用于代替 【表名_set】 如: obj.表名_set.all() 在做自关联时必须指定此字段,防止查找 冲突 5、delated_query_name=None, # 反向操作时,使用的连接前缀,用于替换 【表名】 #如: models.UserGroup.objects.filter(表名__字段名=1).values('表名__字段名') '''
3.Django多对多表结构操作
3.1 第一种: ManyToManyField
自己不创建第三张关系表,有m2m字段,根据queryset对象增删改查(推荐)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from django.db import models # Create your models here. class UserInfo(models.Model): username=models.CharField(max_length=32) def __str__(self): return self.username class UserGroup(models.Model): group_name=models.CharField(max_length=64) user_info=models.ManyToManyField(to='UserInfo',related_query_name='m2m') def __str__(self): return self.group_name
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from django.shortcuts import render # Create your views here. from django.shortcuts import HttpResponse from app03 import models def orm03(request): user_info_obj=models.UserInfo.objects.get(username='水果') # print(user_info_obj) user_info_objs=models.UserInfo.objects.all() # print(user_info_objs) # print(user_info_objs) group_obj=models.UserGroup.objects.get(group_name='zhangsan') # print(group_obj) group_objs=models.UserGroup.objects.all() # print(group_objs) #添加:正向添加到第三张表 # a=group_obj.user_info.add(user_info_obj) # print(a) # group_obj.user_info.add(*user_info_objs) #删除正向 # group_obj.user_info.remove(user_info_obj) # group_obj.user_info.remove(*user_info_objs) #添加反向 # user_info_obj.usergroup_set.add(group_obj) # user_info_obj.usergroup_set.add(*group_objs) #删除反向 # user_info_obj.usergroup_set.remove(group_obj) # user_info_obj.usergroup_set.remove(*group_objs) #查询正向 # print(group_obj.user_info.all()) #查找group_python组中所有用户 # print(group_obj.user_info.all().filter(username='zhangsan')) #查找 反向 # print(user_info_obj.usergroup_set.all()) # 查找用户 zhangsan属于那些组 # print(user_info_obj.usergroup_set.all().filter(group_name='group_python')) #双下划线正向,反向查询 #正向:从用户组表中查找zhangsan属于那个用户组: print(models.UserGroup.objects.filter(user_info__username='zhangsan')) #反向:从用户表中查询group_python组中有那些用户:related_query_name='m2m' # print(models.UserInfo.objects.filter(m2m__group_name='group_python')) return HttpResponse('orm03')