解决django框架model中外键不落实到数据库问题


Posted in Python onMay 20, 2020

在外键字段的参数中添加db_constraint=False即可,数据库中没有外键关系,代码中依然可以按照正常外键方式使用。

例如:

class User(models.Model):
 name = models.CharField(max_length=255)
 room = models.ForeignKey(Room, db_constraint=False)
class Room(models.Model):
 status = models.IntegerField(default=1)

补充知识:Django不通过外键查询多对多的数据,数据库表设计不使用外键

终于解决了 如何没有通过外键查询多对多的数据,多对一数据

意义: 使用外键,高并发的程序中会产生锁表,影响性能。为了未来的数据库扩展,数据库设计时考虑使用外键,但在实际数据库设计时,将外键的实现放在逻辑层控制。

全部的表都是单表

解决的办法是通过SerializerMethodField自定义字段来实现。

model 定义,无外键

# -*- coding:UTF-8 -*-
from django.db import models
#导入django自带的User模型进行扩展
from django.contrib.auth.models import AbstractUser
 
class Role(models.Model):
  """
  用户角色
  """
  role_name = models.CharField(max_length=100,verbose_name="角色名",help_text="角色名")
 
  class Meta:
    verbose_name = "角色"
    verbose_name_plural = verbose_name
    #用于指定不同的app使用不同的数据库
    # app_label = "users"
    #使用自定义指定的表明jt_role
    db_table = "jt_role"
 
  def __str__(self):
    return self.role_name
 
class Department(models.Model):
  """
  部门
  """
  depat_name = models.CharField(max_length=64, verbose_name="部门名称", help_text="部门名称")
 
  class Meta:
    verbose_name = "部门"
    verbose_name_plural = verbose_name
    #用于指定不同的app使用不同的数据库
    # app_label = "users"
    #使用自定义指定的表明jt_role
    db_table = "jt_department"
 
  def __str__(self):
    return self.depat_name
 
class UserProfile(models.Model):
  """
  在Django的User模型上进行拓展,id字段使用id
  """
  name = models.CharField(max_length=64, verbose_name="姓名")
  depat_id = models.IntegerField(verbose_name="部门id")
 
  class Meta:
    verbose_name = "用户"
    verbose_name_plural = verbose_name
    #用于指定不同的app使用不同的数据库
    # app_label = "users"
    db_table = "jt_users"
 
class UserRole(models.Model):
  """
  用户角色关系,为提高性能,不使用manytomany来实现
  """
  user_id = models.IntegerField(verbose_name="用户id")
  role_id = models.IntegerField(verbose_name="角色id")
  is_delete = models.BooleanField(verbose_name="是否逻辑删除", default=False)
 
  class Meta:
    verbose_name = "用户角色关系"
    verbose_name_plural = verbose_name
    # 使用自定义指定的表明jt_user_role
    db_table = "jt_user_role"

serializers文件定义

from rest_framework import serializers
from .models import UserRole,UserProfile,Role,Department
 
class UserDetailSerializer(serializers.Serializer):
  """
  用户详情序列表类
  """
  name = serializers.CharField()
  depat_name = serializers.SerializerMethodField()
  roles = serializers.SerializerMethodField()
  class Meta:
    model = UserProfile
    fields = ("name", "depat_name","roles")
 
  #重点中的重点
  def get_roles(self, obj):
    """
    自定义获取多对多数据
    :param obj: 当前user的实例
    :return: 当前用户的全部角色(数组)
    :思路:先通过当前的用户,查询用户角色关系表,获得全部的角色id,再通过角色id获得角色名
    """
    user = obj
    role_ids = UserRole.objects.filter(user_id__exact=user.id).values_list('role_id').all()
    roles = Role.objects.filter(id__in=role_ids).all()
    ret = [ ]
    for item in roles:
      ret.append(item.role_name)
    return ret
 
  def get_depat_name(self,obj):
    """
    获取部门名称
    :param obj: 当前user的实例
    :return: 当前用户所在部门名称
    """
    user = obj
    depat_name = Department.objects.filter(id = user.depat_id)[0].depat_name
    return depat_name

解决django框架model中外键不落实到数据库问题

以上这篇解决django框架model中外键不落实到数据库问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python命令行参数解析模块getopt使用实例
Apr 13 Python
python实现TCP服务器端与客户端的方法详解
Apr 30 Python
Python中DJANGO简单测试实例
May 11 Python
探究Python中isalnum()方法的使用
May 18 Python
Python中动态创建类实例的方法
Mar 24 Python
Python中的defaultdict与__missing__()使用介绍
Feb 03 Python
VSCode下配置python调试运行环境的方法
Apr 06 Python
python制作图片缩略图
Apr 30 Python
使用python将mysql数据库的数据转换为json数据的方法
Jul 01 Python
Python 模拟动态产生字母验证码图片功能
Dec 24 Python
解决windows下python3使用multiprocessing.Pool出现的问题
Apr 08 Python
用python计算文件的MD5值
Dec 23 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
May 20 #Python
让Django的BooleanField支持字符串形式的输入方式
May 20 #Python
django 解决model中类写不到数据库中,数据库无此字段的问题
May 20 #Python
基于Python脚本实现邮件报警功能
May 20 #Python
完美解决Django2.0中models下的ForeignKey()问题
May 19 #Python
Django 解决model 反向引用中的related_name问题
May 19 #Python
django queryset 去重 .distinct()说明
May 19 #Python
You might like
PHP的Yii框架中创建视图和渲染视图的方法详解
2016/03/29 PHP
Yii2中使用join、joinwith多表关联查询
2016/06/30 PHP
PHP之认识(二)关于Traits的用法详解
2019/04/11 PHP
JS打印gridview实现原理及代码
2013/02/05 Javascript
JS 新增Cookie 取cookie值 删除cookie 举例详解
2014/10/10 Javascript
javascript实现倒计时(精确到秒)
2015/06/26 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
AngularJS转换响应内容
2016/01/27 Javascript
解决jquery appaend元素中id绑定事件失效的问题
2017/09/12 jQuery
three.js中文文档学习之通过模块导入
2017/11/20 Javascript
element 结合vue 在表单验证时有值却提示错误的解决办法
2018/01/22 Javascript
Vue组件通信的四种方式汇总
2018/02/08 Javascript
基于VuePress 轻量级静态网站生成器的实现方法
2018/04/17 Javascript
NodeJS如何实现同步的方法示例
2018/08/24 NodeJs
JavaScript中跨域问题的深入理解
2021/03/04 Javascript
[03:04]2018年国际邀请赛典藏宝瓶&莱恩声望物品展示 片尾有彩蛋
2018/06/04 DOTA
简介Python的collections模块中defaultdict类型的用法
2016/07/07 Python
Django自定义插件实现网站登录验证码功能
2017/04/19 Python
python使用正则表达式替换匹配成功的组
2017/11/17 Python
对python append 与浅拷贝的实例讲解
2018/05/04 Python
Python获取、格式化当前时间日期的方法
2020/02/10 Python
python字符串下标与切片及使用方法
2020/02/13 Python
利用Python自动化操作AutoCAD的实现
2020/04/01 Python
解决jupyter notebook显示不全出现框框或者乱码问题
2020/04/09 Python
Pandas中DataFrame基本函数整理(小结)
2020/07/20 Python
UGG英国官方网站:UGG UK
2018/02/08 全球购物
吉列剃须刀美国官网:Gillette美国
2018/07/13 全球购物
外包公司软件测试工程师
2014/11/01 面试题
农村产权制度改革实施方案
2014/03/21 职场文书
《画杨桃》教学反思
2014/04/13 职场文书
行政专员岗位职责说明书
2014/09/01 职场文书
2014医学院领导干部四风对照检查材料思想汇报
2014/09/16 职场文书
springboot 自定义配置 解决Boolean属性不生效
2022/03/18 Java/Android
Python if else条件语句形式详解
2022/03/24 Python
python套接字socket通信
2022/04/01 Python
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
2022/04/14 Python