Django开发中取消外键约束及关系操作详解

Elena
Elena
发布时间:2026-10-13 | 5人浏览过
原创

本文介绍如何在Django开发环境中通过数据库配置取消外键约束,并详细讲解一对一、一对多及多对多关系中的外键赋值与删除操作。涵盖related_name反查机制、对象赋值与ID赋值两种方法,以及多对多关系中add与remove的具体实现步骤。

Django取消外键约束配置

以下内容直接展示核心代码与配置,便于快速参考。


# 在setting设置外键
'OPTIONS': {
   "init_command": "SET foreign_key_checks = 0;",
  }

Django外键关系操作详解

补充知识:Django中外键关系的传值与删除处理

关于反向查询(Related Query):

在模型定义中,可通过设置 related_name 属性来指定反向查询的名称。若未手动设置,Django 会默认使用模型类名的小写形式加上 '_set' 后缀,例如 book_set。

一对一关系赋值

一对一关系的外键赋值方式:


class ModelStudy(View):
 ''' ClassRoom和ClassNumber是一对一关系,给外键传值 '''
 def get(self, request):
  ''' 两种方法 教室ClassRoom和教室编号ClassNumber 外键字段在django类里名(room_number)在数据库名(room_number_id) '''
     # 一.1赋值对象给外键字段
  # room_number = ClassNumber.objects.filter(class_number__exact='003')[0] # d对List切片
  # c = ClassRoom()
  # c.room_number = room_number
  # c.save()
  # 1.2新增数据并赋值对象给新增字段
  room_number = ClassNumber.objects.filter(class_number__exact='003')[0]
  print room_number
  ClassRoom.objects.create(name="python教室", room_number=room_number) # 新增数据

     # 二:获取外键字段(数据库的外键字段名字room_number_id)的值,将相对应的值直接赋值给该外键字段
     class_number = ClassNumber.object.get("id=1").room_number # 获取教室编号具体值 ‘001'
     c = ClassRoom.object.filter(id=1)[0]
     c.room_number_id = class_number # 将‘001'复制给数据库外键字段 外键字段在django类里名(room_number)在数据库名(room_number_id)
     c.save()
return HttpResponse("ojbk")

一对多关系处理

一对多关系(多对一):

其逻辑与一对一类似,区别在于“多”的一方可以关联多个“一”方的实例。需要注意的是,通过“一”方的反向查询获取数据时,结果可能包含多条记录,此时需使用 .all() 方法来获取所有关联对象。

以 Book(书)和 Reply(评论)两张表为例,二者构成一对多关系,其中 Reply 为“多”的一方。若未设置 related_name,Django 默认生成的反向查询为 Book.objects.get(id=1).reply_set.all()。

多对多关系与删除

多对多关系的外键赋值与处理:


class ModelStudy(View):
 ''' Students和Teachers是多对多关系 '''
 def get(self, request):
  ''' 两种情况 '''
  # 主类(外键所在类)数据已经存在
  # t = Teachers.objects.get(id=1)
  # s = Students.objects.get(name="学生3")
  # s.teacher.add(t) # 多对多需要add数据
  # s.save()

  # 主类数据不存在,新增数据时, 需先save()
  t = Teachers.objects.get(id=1)
  s = Students(name='xiaodong1', age=10, gender="男")
  s.save() # 先存新增数据
  s.teacher.add(t) # 再给新增数据添加多对多关系   可以add(t, t1, t2)多个对应的关系
  s.save()
  return HttpResponse("ojbk")

删除外键关联数据的方法:

首先需要查询出对应的关联数据,然后执行删除操作。


class ModelStudy(View):
 ''' Students和Teachers是多对多关系 '''
 def get(self, request):
  ''' 两种情况 '''
  s = Students.objects.get(id=1)
  t = s.teacher.all() # 多对多 s.teacher是一个<QuerySet>list对象 通过反查取值需要all(),get(),filter之类的
  for x in t: # 删除所有对应关系 haha...
   s.teacher.remove(x)
  return HttpResponse("ojbk")

以上关于Django在开发中取消外键约束及关系操作的实现内容,旨在为开发者提供参考。如有更多疑问,欢迎继续支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表