解决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守护进程(daemon)代码实例
Mar 06 Python
浅析Python中的赋值和深浅拷贝
Aug 15 Python
Python实现的多叉树寻找最短路径算法示例
Jul 30 Python
Django框架模板的使用方法示例
May 25 Python
python使用mitmproxy抓取浏览器请求的方法
Jul 02 Python
python实现复制大量文件功能
Aug 31 Python
在python里使用await关键字来等另外一个协程的实例
May 04 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
Jun 10 Python
Python字符串格式化常用手段及注意事项
Jun 17 Python
Python基于locals返回作用域字典
Oct 17 Python
用python-webdriver实现自动填表的示例代码
Jan 13 Python
python tkinter Entry控件的焦点移动操作
May 22 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中memcache的应用
2013/06/18 PHP
PHP生成验证码时“图像因其本身有错无法显示”的解决方法
2013/08/07 PHP
php实现分页工具类分享
2014/01/09 PHP
php有效防止图片盗用、盗链的两种方法
2016/11/01 PHP
IE中jscript/javascript的条件编译
2006/09/07 Javascript
JSON JQUERY模板实现说明
2010/07/03 Javascript
jquery live()重复绑定的解决方法介绍
2014/01/03 Javascript
jQuery+ajax简单实现文件上传的方法
2016/06/03 Javascript
JS JSOP跨域请求实例详解
2016/07/04 Javascript
ionic开发中点击input时键盘自动弹出
2016/12/23 Javascript
angularjs项目的页面跳转如何实现(5种方法)
2017/05/25 Javascript
浅析Vue.js 中的条件渲染指令
2018/11/19 Javascript
vue router 跳转时打开新页面的示例方法
2019/07/28 Javascript
vue-cli3配置favicon.ico和title的流程
2020/10/27 Javascript
[43:47]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第一场 12.09
2020/12/11 DOTA
跟老齐学Python之眼花缭乱的运算符
2014/09/14 Python
跟老齐学Python之关于类的初步认识
2014/10/11 Python
基于python编写的微博应用
2014/10/17 Python
简单了解什么是神经网络
2017/12/23 Python
Python实现的购物车功能示例
2018/02/11 Python
django rest framework 数据的查找、过滤、排序的示例
2018/06/25 Python
Python实现的简单读写csv文件操作示例
2018/07/12 Python
解决python中 f.write写入中文出错的问题
2018/10/31 Python
python-itchat 获取微信群用户信息的实例
2019/02/21 Python
Appium+python自动化怎么查看程序所占端口号和IP
2019/06/14 Python
Python私有属性私有方法应用实例解析
2020/09/15 Python
爱尔兰灯和灯具网上商店:Lights.ie
2018/03/26 全球购物
Fabletics官网:美国运动服饰品牌,由好莱坞女演员凯特·哈德森创立
2019/10/19 全球购物
加拿大户外探险购物网站:SAIL
2020/06/27 全球购物
用友笔试题目
2016/10/25 面试题
自我介绍演讲稿范文
2014/08/21 职场文书
党员干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
汽车销售员工作总结
2015/08/12 职场文书
高三生物教学反思
2016/02/22 职场文书
小学教代会开幕词
2016/03/04 职场文书
解决Windows Server2012 R2 无法安装 .NET Framework 3.5
2022/04/29 Servers