解决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


猜你喜欢
- 用nodejs怎样来实现对微信公众平台的开发呢?别的就不多说了,先来简单介绍微信公众平台的基本原理。微信服务器就相当于一个转发服务器,终端(
- 下面看下Ubuntu 18.04.4安装mysql的过程,内容如下所示:1 sudo apt-get update2 sudo a
- 本文实例讲述了python输出指定月份日历的方法。分享给大家供大家参考。具体实现方法如下:#!/usr/bin/pythonimport c
- 执行表扫描操作之前,将调用info()函数,以便为优化程序提供额外信息。优化程序所需的信息不是通过返回值给定的,你需填充存储引擎类的特定属性
- 用法本脚本用于批量扫描端口 1.在同目录下创建输入文件,属性inputFile为输入文件名2.属性th为线程数3.属性port为探测的目标端
- JavaScript onkeypress 事件用户按下或按住一个键盘按键时会触发 onkeypress 事件。注意:onkeypress
- 一些大型站点都有着非常一流的视觉外观,它们很可能在设计时使用了网格系统。网格可以是页面布局显得紧凑而且稳定,为设计师在设计站点时提供一个逻辑
- 使用索引的场景:阿里云日志里出现了慢sql 然后发现publish_works_id字段会经常用于一些关联,所以决定把这个字段加上
- 可以用作一些资源的释放。1.在一个函数内的defer执行顺序是先写的后执行,后写的先执行(遵循栈结构)func DeferTest1(){
- 本文实例汇总了常用的JavaScript弹出窗口方法,供大家对比参考,希望能对大家有所帮助。详细方法如下:1.无提示刷新网页:大家有没有发现
- 权重初始化对于训练神经网络至关重要,好的初始化权重可以有效的避免梯度消失等问题的发生。在pytorch的使用过程中有几种权重初始化的方法供大
- 按照惯例,年底的淘宝的确是到了“需要改版的时候”。这次新版的淘宝首页上线,乍看并没有多少夺人眼球的地方,但仔细揣摩其中的细节,还是发现了不少
- 本文实例讲述了让thinkphp支持大小写url地址访问的方法。分享给大家供大家参考。具体实现方法如下:通常ThinkPHP默认是区别大小写
- 设置某个字段的值自增由于某个业务需要手动操作数据库,并设置主键ID不重复。做个记录set @rownum=0;select a.id, @r
- 本文实例讲述了微信小程序列表渲染功能之列表下拉刷新及上拉加载的实现方法。分享给大家供大家参考,具体如下:微信小程序为2017年1月9日打下了
- 马上要过年了,用 Python 写一副春联&福字送给大家,本文我们主要用到的 Python 库为 tkinter,下面一起来看一下具
- 大家经常在网上登陆的时候经常会看到让你输入验证码,有的是文字的,有的呢是图片,比如chinaren.com校友录中留言的时候,我们就会看到数
- 在做自动化测试时,遇到两种情况需要判断usb是否已连接上(注,本文仅针对用adb命令来control手机)一种是在开测时(前提是同时要测试多
- 在asp中利用excel的一个方法是将excel文件作为一个数据库进行链接,然后的操作和对access数据库操作类似.但是这个方法不是总能有
- 分享一个用正则表达式校验电话号码、身份证号、日期格式、URL、Email等等格式的工具类package com.eabax.util;imp