解决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 08 Python
python类的继承实例详解
Mar 30 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
May 31 Python
详细分析python3的reduce函数
Dec 05 Python
Python IDLE入门简介
Dec 08 Python
python读取和保存视频文件
Apr 16 Python
对Python中type打开文件的方式介绍
Apr 28 Python
python 实现在Excel末尾增加新行
May 02 Python
Python通过递归获取目录下指定文件代码实例
Nov 07 Python
numpy.array 操作使用简单总结
Nov 08 Python
keras .h5转移动端的.tflite文件实现方式
May 25 Python
python中requests模拟登录的三种方式(携带cookie/session进行请求网站)
Nov 17 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
snoopy PHP版的网络客户端提供本地下载
2008/04/15 PHP
支持中文字母数字、自定义字体php验证码代码
2012/02/27 PHP
CodeIgniter中实现泛域名解析
2014/07/19 PHP
YII Framework框架教程之日志用法详解
2016/03/14 PHP
基于thinkphp6.0的success、error实现方法
2019/11/05 PHP
IE无法设置短域名下Cookie
2010/09/23 Javascript
一个可拖拽列宽表格实例演示
2012/11/26 Javascript
js 采用delete实现继承示例代码
2014/05/20 Javascript
checkbox勾选判断代码分析
2014/06/11 Javascript
js实现简易的单数字随机抽奖(0-9)
2020/03/19 Javascript
深入理解setTimeout函数和setInterval函数
2016/05/20 Javascript
完美解决jQuery 鼠标快速滑过后,会执行多次滑出的问题
2016/12/08 Javascript
JavaScript中的call和apply的用途以及区别
2017/01/11 Javascript
jquery Ajax 全局调用封装实例详解
2017/01/16 Javascript
AngularJS改变元素显示状态
2017/04/20 Javascript
js阻止默认右键的下拉菜单方法
2018/01/02 Javascript
jQuery实现的下雪动画效果示例【附源码下载】
2018/02/02 jQuery
vue 页面加载进度条组件实例
2018/02/05 Javascript
vue-resource:jsonp请求百度搜索的接口示例
2019/11/09 Javascript
详解vue组件之间的通信
2020/08/30 Javascript
[11:33]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第二场
2018/04/06 DOTA
为Python的Tornado框架配置使用Jinja2模板引擎的方法
2016/06/30 Python
Python numpy 常用函数总结
2017/12/07 Python
浅谈Django REST Framework限速
2017/12/12 Python
完美解决python针对hdfs上传和下载的问题
2020/06/05 Python
在HTML5中如何使用CSS建立不可选的文字
2014/10/17 HTML / CSS
使用CSS3的box-sizing属性解决div宽高被内边距撑开的问题
2016/06/28 HTML / CSS
橄榄树药房:OLIVEDA
2019/09/01 全球购物
英国行业制服供应商:Alexandra
2019/09/14 全球购物
亚马逊巴西站:Amazon.com.br
2019/09/22 全球购物
房地产开发项目建议书
2014/05/16 职场文书
中专生自荐信
2014/06/25 职场文书
会计岗位说明书
2014/07/29 职场文书
2014年党风廉政工作总结
2014/12/03 职场文书
保护动物的宣传语
2015/07/13 职场文书
2016干部作风整顿心得体会
2016/01/22 职场文书