解决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中的引用和拷贝浅析
Nov 22 Python
一条命令解决mac版本python IDLE不能输入中文问题
May 15 Python
对python多线程SSH登录并发脚本详解
Feb 14 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
Oct 11 Python
使用Python来做一个屏幕录制工具的操作代码
Jan 18 Python
如何通过python实现全排列
Feb 11 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
Apr 10 Python
python如何安装下载后的模块
Jul 03 Python
python 基于DDT实现数据驱动测试
Feb 18 Python
python 将Excel转Word的示例
Mar 02 Python
详解分布式系统中如何用python实现Paxos
May 18 Python
Python基础知识学习之类的继承
May 31 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网页游戏学习之Xnova(ogame)源码解读(十四)
2014/06/26 PHP
PHP解压tar.gz格式文件的方法
2016/02/14 PHP
thinkPHP5.0框架环境变量配置方法
2017/03/17 PHP
php使用str_replace替换多维数组的实现方法分析
2017/06/15 PHP
php对微信支付回调处理的方法
2018/08/23 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
PHP中abstract(抽象)、final(最终)和static(静态)原理与用法详解
2020/06/05 PHP
javascript new fun的执行过程
2010/08/05 Javascript
javascript使用定时函数实现跳转到某个页面
2013/12/25 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件包装
2015/11/20 Javascript
EasyUi中的Combogrid 实现分页和动态搜索远程数据
2016/04/01 Javascript
jQuery简单实现遍历单选框的方法
2017/03/06 Javascript
vue.js动态数据绑定学习笔记
2017/05/19 Javascript
vue小图标favicon不显示的解决方案
2017/09/19 Javascript
vue2.0实现前端星星评分功能组件实例代码
2018/02/12 Javascript
聊聊Vue 中 title 的动态修改问题
2019/06/11 Javascript
[14:03]2017DOTA2亚洲邀请赛开幕式:12神兵演绎水墨中华
2017/04/01 DOTA
玩转python爬虫之URLError异常处理
2016/02/17 Python
Python 爬虫之Beautiful Soup模块使用指南
2018/07/05 Python
使用python进行广告点击率的预测的实现
2019/07/04 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
2019/08/07 Python
Python3.0 实现决策树算法的流程
2019/08/08 Python
在tensorflow中实现屏蔽输出的log信息
2020/02/04 Python
解决Jupyter无法导入已安装的 module问题
2020/04/17 Python
Python爬虫之Selenium多窗口切换的实现
2020/12/04 Python
Python的logging模块基本用法
2020/12/24 Python
Python实现我的世界小游戏源代码
2021/03/02 Python
中东最大的在线宠物店:Dubai Pet Food
2020/06/11 全球购物
写演讲稿要注意的六件事
2014/01/14 职场文书
暑期社会实践方案
2014/02/05 职场文书
《燕子专列》教学反思
2014/02/21 职场文书
法人授权委托书
2014/04/03 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
英语教师求职信范文
2015/03/20 职场文书
Python打包为exe详细教程
2021/05/18 Python
vue代码分块和懒加载非必要资源文件
2022/04/11 Vue.js