解决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 18 Python
Python中的推导式使用详解
Jun 03 Python
举例讲解Python设计模式编程中的访问者与观察者模式
Jan 26 Python
python 将字符串转换成字典dict的各种方式总结
Mar 23 Python
Django 内置权限扩展案例详解
Mar 04 Python
Python list与NumPy array 区分详解
Nov 06 Python
flask框架url与重定向操作实例详解
Jan 25 Python
python实现ip地址的包含关系判断
Feb 07 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
Jun 24 Python
python自动化测试三部曲之unittest框架的实现
Oct 07 Python
使用Python Tkinter实现剪刀石头布小游戏功能
Oct 23 Python
Django admin组件的使用
Oct 24 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中GET变量的使用
2006/10/09 PHP
php遍历文件夹和文件列表示例分享
2014/03/11 PHP
变量在 PHP7 内部的实现(二)
2015/12/21 PHP
PHP实现可自定义样式的分页类
2016/03/29 PHP
[原创]php简单防盗链验证实现方法
2016/07/09 PHP
利用php-cli和任务计划实现订单同步功能的方法
2017/05/03 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
PHP实现的MD5结合RSA签名算法实例
2017/10/07 PHP
基于jQuery Circlr插件实现产品图片360度旋转
2015/09/20 Javascript
JS中如何实现复选框全选功能
2016/12/19 Javascript
json的结构与遍历方法实例分析
2017/04/25 Javascript
slideToggle+slideup实现手机端折叠菜单效果
2017/05/25 Javascript
JavaScript 点击触发复制功能实例详解
2018/11/02 Javascript
微信小程序实现的五星评价功能示例
2019/04/25 Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
2019/08/01 Javascript
微信小程序保持session会话的方法
2020/03/20 Javascript
vue总线机制(bus)知识点详解
2020/05/10 Javascript
Element中Slider滑块的具体使用
2020/07/29 Javascript
[06:10]6.81新信使新套装!给你一个炫酷的DOTA2
2014/05/06 DOTA
pyenv命令管理多个Python版本
2017/03/26 Python
Python使用add_subplot与subplot画子图操作示例
2018/06/01 Python
Python如何实现转换URL详解
2019/07/02 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
2019/07/08 Python
Python第三方包之DingDingBot钉钉机器人
2020/04/09 Python
Python中如何添加自定义模块
2020/06/09 Python
新手学习Python2和Python3中print不同的用法
2020/06/09 Python
圣彼得堡鲜花配送:Semicvetic
2020/09/15 全球购物
简历中求职的个人自我评价
2013/12/03 职场文书
竞选部门副经理的自荐书范文
2014/02/11 职场文书
委托协议书范本
2014/04/22 职场文书
论文指导教师评语
2014/04/28 职场文书
信访工作经验交流材料
2014/05/23 职场文书
爱的奉献演讲稿
2014/09/10 职场文书
关于开学的感想
2015/08/10 职场文书
2020年元旦祝福语录,总有适合你的
2019/12/31 职场文书
victoriaMetrics库布隆过滤器初始化及使用详解
2022/04/05 Golang