字段的使用一对多,多对多,普通字段

1.一对多的基本增删改查操作

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)
app01/models.py
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')
app01/views.py

直接在主路由配置

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 一对多查找更多操作

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
    )
app02/models.py
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')
app02/views.py

2.2 一对多使用values和values_list结合双下划线跨表查

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')
app02/views.py

2.3 一对多ForeignKey可选参数

'''

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('表名__字段名')

'''
View Code

3.Django多对多表结构操作 

3.1 第一种: ManyToManyField

自己不创建第三张关系表,有m2m字段,根据queryset对象增删改查(推荐)

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
app03/models.py
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')
app03/views.py
原文地址:https://www.cnblogs.com/xiaoxiamiaichiyu/p/13894583.html