解决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迭代器和生成器介绍
Mar 06 Python
Python实现将罗马数字转换成普通阿拉伯数字的方法
Apr 19 Python
python在html中插入简单的代码并加上时间戳的方法
Oct 16 Python
python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用
Apr 03 Python
Python使用import导入本地脚本及导入模块的技巧总结
Aug 07 Python
详解Python修复遥感影像条带的两种方式
Feb 23 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
Mar 26 Python
Python学习工具jupyter notebook安装及用法解析
Oct 23 Python
详解基于python的图像Gabor变换及特征提取
Oct 26 Python
解决numpy和torch数据类型转化的问题
May 23 Python
python ansible自动化运维工具执行流程
Jun 24 Python
关于Python使用turtle库画任意图的问题
Apr 01 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 和 MySQL 基础教程(四)
2006/10/09 PHP
投票管理程序
2006/10/09 PHP
php+mysqli使用面向对象方式查询数据库实例
2015/01/29 PHP
PHP模糊查询的实现方法(推荐)
2016/09/06 PHP
Eclipse PHPEclipse 配置的具体步骤
2017/08/08 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
js 浏览本地文件夹系统示例代码
2013/10/24 Javascript
Extjs4中的分页应用结合前后台
2013/12/13 Javascript
深入分析javascript中的错误处理机制
2016/07/17 Javascript
微信小程序开发之数据存储 参数传递 数据缓存
2017/04/13 Javascript
koa上传excel文件并解析的实现方法
2018/08/09 Javascript
JS实现的简单分页功能示例
2018/08/23 Javascript
深入理解 Koa 框架中间件原理
2018/10/18 Javascript
vue-quill-editor+plupload富文本编辑器实例详解
2018/10/19 Javascript
KOA+egg.js集成kafka消息队列的示例
2018/11/09 Javascript
tracking.js页面人脸识别插件使用方法
2020/04/16 Javascript
微信小程序下拉刷新PullDownRefresh的使用方法
2018/11/29 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
2019/02/15 jQuery
vue的hash值原理也是table切换实例代码
2020/12/14 Vue.js
python利用Tesseract识别验证码的方法示例
2019/01/21 Python
Python增强赋值和共享引用注意事项小结
2019/05/28 Python
python3中numpy函数tile的用法详解
2019/12/04 Python
执行Python程序时模块报错问题
2020/03/26 Python
利用Opencv实现图片的油画特效实例
2021/02/28 Python
科颜氏美国官网:Kiehl’s美国
2017/01/31 全球购物
英国和爱尔兰的自炊式豪华度假小屋:Rural Retreats
2018/06/08 全球购物
俄罗斯卫浴采暖及维修用品超级市场:Dkrussia
2020/05/12 全球购物
计算机专业自荐信
2013/10/14 职场文书
营销总经理岗位职责
2014/02/02 职场文书
继承公证书样本
2014/04/04 职场文书
公证书样本
2014/04/10 职场文书
英语四级考试作弊检讨书
2014/09/29 职场文书
淮阳太昊陵导游词
2015/02/10 职场文书
高中生个性发展自我评价
2015/03/09 职场文书
离婚案件被告代理词
2015/05/23 职场文书
python编程实现清理微信重复缓存文件
2021/11/01 Python