解决django框架model中外键不落实到数据库问题
作者:sayokooo 时间:2024-01-13 20:36:12
在外键字段的参数中添加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
标签:django,model,外键,数据库
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
pyqt5 QListWidget的用法解析
2023-09-24 21:30:31
![](https://img.aspxhome.com/file/2023/9/70749_0s.gif)
判断触发器正在处理的是插入,删除还是更新触发
2012-01-29 18:30:34
通过屏蔽IP来防止采集
2007-08-19 15:28:00
MySql 8.0.11安装配置教程
2024-01-18 23:41:46
![](https://img.aspxhome.com/file/2023/2/68592_0s.png)
VUE跨域详解以及常用解决跨域的方法
2024-06-07 16:04:29
![](https://img.aspxhome.com/file/2023/5/121965_0s.png)
Python pandas 列转行操作详解(类似hive中explode方法)
2021-02-18 15:12:31
![](https://img.aspxhome.com/file/2023/4/133814_0s.jpg)
Vue双向绑定原理及实现方法
2024-05-10 14:16:55
jupyter notebook 调用环境中的Keras或者pytorch教程
2022-10-07 23:23:09
![](https://img.aspxhome.com/file/2023/5/92525_0s.jpg)
Oracle 数据库中创建合理的数据库索引
2024-01-24 12:37:05
mysql启动的error 2003和1067错误问题解决方法
2024-01-28 14:20:38
浅谈spring boot 集成 log4j 解决与logback冲突的问题
2023-06-22 13:12:05
在SQL Server中处理空值时涉及的三个问题
2009-02-05 15:30:00
![](https://img.aspxhome.com/file/UploadPic/20092/2009210182215203.jpg)
python中metaclass原理与用法详解
2023-11-26 23:27:56
Python编写简单的HTML页面合并脚本
2022-08-13 09:13:07
java JSP开发之Spring中Bean的使用
2023-06-16 07:35:08
![](https://img.aspxhome.com/file/2023/1/77461_0s.png)
JavaScript中的一些实用小技巧总结
2024-04-10 10:45:15
Pycharm 创建 Django admin 用户名和密码的实例
2021-02-10 01:46:46
![](https://img.aspxhome.com/file/2023/9/82569_0s.jpg)
python3制作捧腹网段子页爬虫
2021-01-17 20:58:48
![](https://img.aspxhome.com/file/2023/5/128205_0s.jpg)
Python中os模块的12种用法总结
2023-12-01 07:16:28
![](https://img.aspxhome.com/file/2023/4/79734_0s.png)
MySQL字段类型详解
2009-01-05 09:23:00