解决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实现的NN神经网络算法完整示例
Jun 19 Python
Python通过调用有道翻译api实现翻译功能示例
Jul 19 Python
Python对切片命名的实现方法
Oct 16 Python
解决python 自动安装缺少模块的问题
Oct 22 Python
python通过opencv实现图片裁剪原理解析
Jan 19 Python
Python实现遗传算法(二进制编码)求函数最优值方式
Feb 11 Python
python 中的paramiko模块简介及安装过程
Feb 29 Python
python 在sql语句中使用%s,%d,%f说明
Jun 06 Python
在keras中model.fit_generator()和model.fit()的区别说明
Jun 17 Python
Python如何实现后端自定义认证并实现多条件登陆
Jun 22 Python
PyCharm2020.3.2安装超详细教程
Feb 08 Python
忆童年!用Python实现愤怒的小鸟游戏
Jun 07 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
PHP4 与 MySQL 数据库操作函数详解
2006/12/06 PHP
PHP操作Redis常用命令的实例详解
2020/12/23 PHP
JavaScript的9个陷阱及评点分析
2008/05/16 Javascript
javascript一些不错的函数脚本代码
2008/09/10 Javascript
javascript+mapbar实现地图定位
2010/04/09 Javascript
javascript 触发HTML元素绑定的函数
2010/09/11 Javascript
JS文本框不能输入空格验证方法
2013/03/19 Javascript
jquery重新播放css动画所遇问题解决
2013/08/21 Javascript
根据配置文件加载js依赖模块
2014/12/29 Javascript
深入解读JavaScript中的Hoisting机制
2015/08/12 Javascript
JS根据生日月份和日期计算星座的简单实现方法
2016/11/24 Javascript
详解NodeJs支付宝移动支付签名及验签
2017/01/06 NodeJs
JS仿QQ好友列表展开、收缩功能(第二篇)
2017/07/07 Javascript
Node.js学习之地址解析模块URL的使用详解
2017/09/28 Javascript
p5.js入门教程之小球动画示例代码
2018/03/15 Javascript
python文件的md5加密方法
2016/04/06 Python
深入理解NumPy简明教程---数组3(组合)
2016/12/17 Python
基于Python的文件类型和字符串详解
2017/12/21 Python
python自动发邮件库yagmail的示例代码
2018/02/23 Python
python使用xslt提取网页数据的方法
2018/02/23 Python
python中bytes和str类型的区别
2019/10/21 Python
python框架flask表单实现详解
2019/11/04 Python
Python hashlib模块加密过程解析
2019/11/05 Python
将tensorflow模型打包成PB文件及PB文件读取方式
2020/01/23 Python
pytorch 模型的train模式与eval模式实例
2020/02/20 Python
详解如何在PyCharm控制台中输出彩色文字和背景
2020/08/17 Python
Kathmandu英国网站:新西兰户外运动品牌
2017/03/27 全球购物
Hotels.com南非:酒店预订
2017/11/02 全球购物
如何通过jdbc调用存储过程
2012/04/19 面试题
小学生作文评语
2014/04/18 职场文书
2015年世界水日活动总结
2015/02/09 职场文书
世界环境日活动总结
2015/02/11 职场文书
Python数据分析之pandas函数详解
2021/04/21 Python
教你使用Pandas直接核算Excel中快递费用
2021/05/12 Python
python 中的jieba分词库
2021/11/23 Python
Windows server 2012 NTP时间同步的实现
2022/06/25 Servers