解决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列表去重的二种方法
Feb 14 Python
python概率计算器实例分析
Mar 25 Python
基于python的Tkinter实现一个简易计算器
Dec 31 Python
python 获取sqlite3数据库的表名和表字段名的实例
Jul 17 Python
Python学习笔记之列表推导式实例分析
Aug 13 Python
对django的User模型和四种扩展/重写方法小结
Aug 17 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
Feb 20 Python
Python爬虫爬取新闻资讯案例详解
Jul 14 Python
python中关于数据类型的学习笔记
Jul 19 Python
python遍历路径破解表单的示例
Nov 21 Python
Django多个app urls配置代码实例
Nov 26 Python
Pyqt5将多个类组合在一个界面显示的完整示例
Sep 04 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获得文件扩展名三法
2006/11/25 PHP
PHP中的表达式简述
2016/05/29 PHP
php实现的生成迷宫与迷宫寻址算法完整实例
2017/11/06 PHP
tp5框架使用composer实现日志记录功能示例
2019/01/10 PHP
php中钩子(hook)的原理与简单应用demo示例
2019/09/03 PHP
Jquery显示和隐藏元素或设为只读(含Ligerui的控件禁用,实例说明介绍)
2013/07/09 Javascript
JavaScript正则表达式中的ignoreCase属性使用详解
2015/06/16 Javascript
浅谈JS继承_寄生式继承 & 寄生组合式继承
2016/08/16 Javascript
Boostrap基础教程之JavaScript插件篇
2016/09/08 Javascript
详解AngularJs HTTP响应拦截器实现登陆、权限校验
2017/04/11 Javascript
js轮播图透明度切换(带上下页和底部圆点切换)
2017/04/27 Javascript
Bootstrap Table使用整理(三)
2017/06/09 Javascript
SVG动画vivus.js库使用小结(实例代码)
2017/09/14 Javascript
浅析JS中回调函数及用法
2018/07/25 Javascript
快速解决bootstrap下拉菜单无法隐藏的问题
2018/08/10 Javascript
JSONP原理及应用实例详解
2018/09/13 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
2018/10/31 Javascript
微信小程序 授权登录详解(附完整源码)
2019/08/23 Javascript
详解Vue2的diff算法
2021/01/06 Vue.js
使用XML库的方式,实现RPC通信的方法(推荐)
2017/06/14 Python
快速排序的四种python实现(推荐)
2019/04/03 Python
windows中安装Python3.8.0的实现方法
2019/11/19 Python
Python3连接Mysql8.0遇到的问题及处理步骤
2020/02/17 Python
使用python-Jenkins批量创建及修改jobs操作
2020/05/12 Python
python调用win32接口进行截图的示例
2020/11/11 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
2020/11/20 Python
关于前端上传文件全面基础扫盲贴(入门)
2019/08/01 HTML / CSS
html5 css3实例教程 一款html5和css3实现的小机器人走路动画
2014/10/20 HTML / CSS
鼠标滚轮事件和Mac触控板双指事件
2019/12/23 HTML / CSS
教育局长自荐信范文
2013/12/22 职场文书
小学中秋节活动方案
2014/02/06 职场文书
期中考试后的反思
2014/02/08 职场文书
乡镇总工会学雷锋活动总结
2014/03/01 职场文书
出生公证书样本
2014/04/04 职场文书
厕所文明标语
2014/06/11 职场文书
深入理解redis中multi与pipeline
2021/06/02 Redis