解决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的Tornado框架实现数据可视化的教程
May 02 Python
Django框架中数据的连锁查询和限制返回数据的方法
Jul 17 Python
Python操作MongoDB详解及实例
May 18 Python
Python 一句话生成字母表的方法
Jan 02 Python
Python 互换字典的键值对实例
Feb 12 Python
python爬取内容存入Excel实例
Feb 20 Python
详解python调用cmd命令三种方法
Jul 08 Python
简单了解python PEP的一些知识
Jul 13 Python
解决python多行注释引发缩进错误的问题
Aug 23 Python
将pytorch转成longtensor的简单方法
Feb 18 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
Mar 30 Python
Python 串口通信的实现
Sep 29 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 对输入信息的进行安全过滤的函数代码
2012/06/29 PHP
PHP实现的AES加密、解密封装类与用法示例
2018/08/02 PHP
PHP7内核之Reference详解
2019/03/14 PHP
javascript delete 使用示例代码
2010/03/29 Javascript
js 处理URL实用技巧
2010/11/23 Javascript
基于jQuery的输入框在光标位置插入内容, 并选中
2011/10/29 Javascript
基于javascript的JSON格式页面展示美化方法
2014/07/02 Javascript
node.js中的http.request.end方法使用说明
2014/12/10 Javascript
JS获取图片高度宽度的方法分享
2015/04/17 Javascript
jQuery File Upload文件上传插件使用详解
2016/12/06 Javascript
一道面试题引发的对javascript类型转换的思考
2017/03/06 Javascript
Vue.js 使用v-cloak后仍显示变量的解决方法
2018/11/19 Javascript
Angular中innerHTML标签的样式不起作用的原因解析
2019/06/18 Javascript
node解析修改nginx配置文件操作实例分析
2019/11/06 Javascript
pycharm 使用心得(三)Hello world!
2014/06/05 Python
插入排序_Python与PHP的实现版(推荐)
2017/05/11 Python
django 开发忘记密码通过邮箱找回功能示例
2018/04/17 Python
Python中的上下文管理器和with语句的使用
2018/04/17 Python
Python处理中文标点符号大集合
2018/05/14 Python
python安装twisted的问题解析
2018/08/21 Python
django model object序列化实例
2020/03/13 Python
Python3爬虫里关于识别微博宫格验证码的知识点详解
2020/07/30 Python
python计算auc的方法
2020/09/09 Python
基于Python实现粒子滤波效果
2020/12/01 Python
HTML5 Web缓存和运用程序缓存(cookie,session)
2018/01/11 HTML / CSS
艺术用品:Arteza
2018/11/25 全球购物
亚马逊巴西站:Amazon.com.br
2019/09/22 全球购物
英国时尚和家居用品零售商:Matalan
2021/02/28 全球购物
Structs界面控制层技术
2013/10/11 面试题
计算机专业毕业生自荐信
2013/12/31 职场文书
婚礼证婚人证婚词
2014/01/08 职场文书
新学期校长寄语
2014/01/18 职场文书
《充气雨衣》教学反思
2014/04/07 职场文书
2014党员四风对照检查材料思想汇报
2014/09/17 职场文书
老人节标语大全
2014/10/08 职场文书
MySQL串行化隔离级别(间隙锁实现)
2022/06/16 MySQL