解决django框架model中外键不落实到数据库问题
作者:sayokooo 发布时间:2024-01-13 20:36:12
标签:django,model,外键,数据库
在外键字段的参数中添加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
来源:https://blog.csdn.net/yezi1993/article/details/90068696
0
投稿
猜你喜欢
- 一、InnoDB的表级锁在绝大多数情况下应该使用行锁,因为事务和行锁往往是选择InnoDB的理由,但个别情况下也使用表级锁。事务需要更新大部
- 前言本方法基于web2py框架,使用web2py的完整网站数据包创建简单网站。web2py 是一个为Python语言提供的全功能Web应用框
- 1、存储过程基本语法: create procedure sp_name() begin ...... end; 2、如何调用: call
- 其实小程序上面也可以使用 echart 等开源图表库得,而且支持代码包得裁切功能,但是可能我不会用吧,效果不太好,而且我这就一个图,也没什么
- 本文将介绍如何基于Python Django实现验证码登录功能。验证码登录是一种常见的身份验证方式,它可以有效防止恶意攻击和机器人登录。本文
- PHP使用Swagger生成好看的API文档不是不可能,而是非常简单。首先本人使用Laravel框架,所以在Laravel上安装swagge
- 总有人认为linux搭建php环境很复杂,然后尝试安装lnmp一键安装包。其实说白了就是安装一个web服务器,然后支持php即可,很简单的,
- FFmpeg简介FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录
- 用Python基于Google Bard做一个交互式的聊天机器人之前已经通过浏览器试过了 Google Bard ,更多细节请看: Try
- set oSQLServer =server.createobject("SQLDMO.SQLServer")oSQLS
- 0、前言在以前读书的时候,实验室里面要求每天都要关电脑,有时候出去玩得晚了,懒得回实验室关电脑,又没有同学帮忙。于是就想,能不能通过什么手段
- 一、sh是什么SH是一个独特的子进程包装器,可将您的系统程序动态映射到Python函数。SH帮助您用Python编写Shell脚本,既能支持
- 在Python自带的编辑器IDLE中或者Python shell中不能使用cd命令,那么跳到目标路径呢。方法是使用os包下的相关函数实现路径
- 什么是运算符重载让自定义的类生成的对象(实例)能够使用运算符进行操作作用:让自定义的实例像内建对象一样进行运算符操作让程序简洁易读对自定义对
- Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净、整洁、一目了然。要写出 Pythonic(优雅的、地道的、整洁的)代码
- 本文实例讲述了python获取目录下所有文件的方法。分享给大家供大家参考。具体分析如下:os.walk()函数声明:walk(top,top
- #squeeze 函数:从数组的形状中删除单维度条目,即把shape中为1的维度去掉#unsqueeze() 是squeeze()的反向操作
- 本文实例讲述了Python3读取UTF-8文件及统计文件行数的方法。分享给大家供大家参考。具体实现方法如下:'''&
- 获取CPU信息我们先来获取CPU的信息:>>> import psutil>>> psutil.cpu_
- flask是我学习的第一个python的web框架,在应用flask写完一个应用后,当然是把它部署到我们的服务器上了。首先,准备我们部署项目