解决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中lambda与def用法对比实例分析
Apr 30 Python
深入剖析Python的爬虫框架Scrapy的结构与运作流程
Jan 20 Python
深入理解NumPy简明教程---数组2
Dec 17 Python
Python 基础知识之字符串处理
Jan 06 Python
python使用xlrd与xlwt对excel的读写和格式设定
Jan 21 Python
Python生成短uuid的方法实例详解
May 29 Python
Django中使用Celery的方法示例
Nov 29 Python
python如何读取bin文件并下发串口
Jul 05 Python
Python Lambda函数使用总结详解
Dec 11 Python
使用Python绘制台风轨迹图的示例代码
Sep 21 Python
详解python网络进程
Jun 15 Python
尝试使用Python爬取城市租房信息
Apr 12 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 session安全问题分析
2011/06/24 PHP
比较简单的百度网盘文件直链PHP代码
2013/03/24 PHP
基于php冒泡排序算法的深入理解
2013/06/09 PHP
CI框架中cookie的操作方法分析
2014/12/12 PHP
php魔术函数__call()用法实例分析
2015/02/13 PHP
Yii框架实现对数据库的CURD操作示例
2019/09/03 PHP
javascript面向对象入门基础详细介绍
2012/09/05 Javascript
javascript 二进制运算技巧解析
2012/11/27 Javascript
JavaScript前端开发之实现二进制读写操作
2015/11/04 Javascript
深入理解逻辑表达式的用法 与或非的用法
2016/06/06 Javascript
AngularJS 模型详细介绍及实例代码
2016/07/27 Javascript
angularjs的select使用及默认选中设置
2017/04/08 Javascript
nodejs读取并去重excel文件
2018/04/22 NodeJs
JS实现的汉字与Unicode码相互转化功能分析
2018/05/25 Javascript
Vue中android4.4不兼容问题的解决方法
2018/09/04 Javascript
angular4强制刷新视图的方法
2018/10/09 Javascript
多版本Python共存的配置方法
2017/05/22 Python
Python3 socket同步通信简单示例
2017/06/07 Python
利用python实现简单的循环购物车功能示例代码
2017/07/05 Python
Pycharm编辑器技巧之自动导入模块详解
2017/07/18 Python
Python语言描述最大连续子序列和
2017/12/05 Python
Python获取当前公网ip并自动断开宽带连接实例代码
2018/01/12 Python
Python使用pdb调试代码的技巧
2020/05/03 Python
详解Flask前后端分离项目案例
2020/07/24 Python
Python return语句如何实现结果返回调用
2020/10/15 Python
使用CSS3编写灰阶滤镜来制作黑白照片效果的方法
2016/05/09 HTML / CSS
详解如何使用CSS3中的结构伪类选择器和伪元素选择器
2020/01/06 HTML / CSS
公共汽车、火车和飞机票的通用在线预订和销售平台:INFOBUS
2019/11/30 全球购物
大专自我鉴定范文
2013/10/01 职场文书
金融专业大学生自我评价
2014/01/09 职场文书
运动会广播稿200字
2014/01/15 职场文书
地震捐款倡议书
2014/08/29 职场文书
北京离婚协议书范文2014
2014/09/29 职场文书
2015年教育实习工作总结
2015/04/24 职场文书
社区低保工作总结2015
2015/07/23 职场文书
Python first-order-model实现让照片动起来
2022/06/25 Python