Django开发中取消外键约束及关系操作详解
本文介绍如何在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在开发中取消外键约束及关系操作的实现内容,旨在为开发者提供参考。如有更多疑问,欢迎继续支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









