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

以上这篇解决django框架model中外键不落实到数据库问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Django 解决阿里云部署同步数据库报错的问题

    写在最前面: 在阿里云租了一台服务器,搭建了一个博客,采用的是Ubuntu+Django+uwsgi+nginx+mysql的结构. 运行了一段时间后,我发现我忘记了django自带后台的密码! 然后很常规的修改密码的操作,就是无法登陆! 然后想再创建一个超级用户,登上去看看什么情况,结果创建超级用户又报错? 可是本地环境是ok的,然后同步数据库出错...反正没有对的. 然后同步数据库报错如下: 手机端截的图,查了一下报错,应该是setting.py的配置问题,然后我把生产上的代码拿下来看了下.

  • Python的Django框架实现数据库查询(不返回QuerySet的方法)

    一.创建模型类: # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import models class Course(models.Model): """课程表""" name = models.CharField(verbose_name='课程名称', max_length=255) description = models.Tex

  • Django 解决model 反向引用中的related_name问题

    问题: 定义表Apple: class Apple( models.Model): origin_level = models.ForeignKey(AppleLevel) new_level = models.ForeignKey(AppleLevel) 出现如下问题: monitor.apple: Accessor for field 'origin_level' clashes with related field 'AppleLevel.apple_set'. Add a related

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

  • Python Web框架之Django框架Model基础详解

    本文实例讲述了Python Web框架之Django框架Model基础.分享给大家供大家参考,具体如下: model是关于你的数据的单一的,确定的信息来源. 它包含您正在存储的数据的基本字段和行为.Django通过抽象化的模型层(models)为你的网络应用提供对于数据的结构化处理和操作处理,数据库相关的代码一般写在 models.py 中,Django 支持 sqlite3, MySQL, PostgreSQL等数据库,使用数据库API对数据库进行增删改查的操作. 使用哪种数据库,只需要在se

  • Django框架model模型对象验证实现方法分析

    本文实例讲述了Django框架model模型对象验证实现方法.分享给大家供大家参考,具体如下: 模型对象的验证 验证一个模型涉及三个步骤: 验证模型的字段 -- Model.clean_fields() 验证模型的完整性 -- Model.clean() 验证模型的唯一性 -- Model.validate_unique() 当调用模型的full_clean() 方法时,这三个方法都将执行.当使用ModelForm时,is_valid() 将为表单中的所有字段执行这些验证.如果你计划自己处理验证

  • django框架model orM使用字典作为参数,保存数据的方法分析

    本文实例讲述了django框架model orM使用字典作为参数,保存数据的方法.分享给大家供大家参考,具体如下: 假设有一个字典,里面已经有了所有相关信息,现在想利用这个字典作为参数,跟django model  结合,用很少的代码量保存数据,有什么简便方法,比如有如下定义的model: from django.db import models class MyModel(models.Model): title=models.CharField(max_length=250) body= m

  • 利用Django框架中select_related和prefetch_related函数对数据库查询优化

    实例的背景说明 假定一个个人信息系统,需要记录系统中各个人的故乡.居住地.以及到过的城市.数据库设计如下: Models.py 内容如下: from django.db import models class Province(models.Model): name = models.CharField(max_length=10) def __unicode__(self): return self.name class City(models.Model): name = models.Ch

  • Django中外键使用总结

    目录 了解外键 使用外键 在同一个app中使用外键 外间删除操作的参数意思: 在写项目的过程中我们不可避免的会使用到外键这个东西,那么Django中是怎样来使用外键的呢? 了解外键 在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam.如果使用的是InnoDB引擎,是支持外键约束的.外键的存在使得ORM框架在处理表关系的时候异常的强大.MySQL数据库默认使用的也是InnoDB引擎. 使用外键 新建一个项目,创建一个article的app,添加至settings中,并且在se

  • Django表单外键选项初始化的问题及解决方法

    问题描述 先说明一下问题的由来: Django的模型中经常会用ForeignKey来关联其他表格数据 class MeasureTask(models.Model): taskname = models.CharField(max_length=LEN_FULLNAME, verbose_name="任务名称") road = models.ForeignKey(Road, on_delete=models.CASCADE, verbose_name="设计路段")

  • Django中外键ForeignKey介绍使用

    目录 1.on_delete 2.related_name 3.related_query_name 4.外键字段的保存 这一篇笔记介绍 Django 系统 model 的外键处理,ForeignKey 以及相应的处理方法. 这是一种一对多的字段类型,表示两张表之间的关联关系. 本篇笔记的目录如下: on_delete related_name related_query_name 外键字段的保存 1.on_delete 假设有两个 application,app1 和 app2 app1 下的

  • 解决django model修改添加字段报错的问题

    关于django models中添加字段的一个小节,记录下 django的models中已经写好了字段,可是后面我又想在添加一些字段,于是就在models中添加了字段 ,发现报错了 报错的类型: 字段重复了 不知道的列 : 最后解决的方法 : 到models的目录下打开文件 ,直接把所需的字段添加到第一次编译的文件中 , 重新执行数据库的迁移 ,如果依然有报错,提示有未知的列 ,就查看数据库 ,那个列缺失,就把列给添加上 添加未知的列 至此,重新执行迁移 ,妥妥的成功了 ! 以上这篇解决djan

  • Python的Django框架使用入门指引

     前言 传统 Web 开发方式常常需要编写繁琐乏味的重复性代码,不仅页面表现与逻辑实现的代码混杂在一起,而且代码编写效率不高.对于开发者来说,选择一个功能强大并且操作简洁的开发框架来辅助完成繁杂的编码工作,将会对开发效率的提升起到很大帮助.幸运的是,这样的开发框架并不少见,需要做的仅是从中选出恰恰为开发者量身打造的那款Web框架. 自从基于 MVC 分层结构的 Web 设计理念普及以来,选择适合的开发框架无疑是项目成功的关键性因素.无论是 Struts.Spring 或是其他 Web 框架的出现

随机推荐