关系字段(一对多)增 改 查 删

  • Post author:
  • Post category:其他



一对多


外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在‘一对多’中‘多’的一方。

例如:一个学科对应多个学生,一个学生对应一个学科。

from django.db import models

# Create your models here.
#学生类
class Student(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    birthday = models.DateField()
    #设置外键
    subject = models.ForeignKey(to='Subject',to_field='id',on_delete=models.CASCADE)
    def __str__(self):
        return '<Student obj name : {}>'.format(self.name)


#学科类
class Subject(models.Model):
    name=models.CharField(max_length=32)
    price=models.IntegerField()
    def __str__(self):
        return '<Subject obj name : {}>'.format(self.name)


字段:ForeignKey

字段参数:


to:设置要关联的表

to_field:设置要关联的表的字段。默认关联的是表的id。默认的可以不写。

如果想关联其他字段名称可以使用此字段

on_delete:当删除关联表中的数据时,当前表与其关联的行的行为

行为可以有以下:

models.CASCADE:删除关联数据,与之关联也删除

models.DO_NOTHING:删除关联数据,引发错误 IntegrityError。

models.PROTECT:删除关联数据,引发错误ProtectedError。


增加


学生 赵四 学习 python学科

方式一:反向增加

	#1、找到学科类中的python对象
    sub_obj=models.Subject.objects.get(name='python')
    #2、在学生类中创建学生赵四
    sub_obj.student_set.create(
        name='赵四',
        age=20,
        birthday='2000-02-11',
    )

方式二:正向增加

#1、找到学科类中的python对象
    sub_obg=models.Subject.objects.get(name='python')
    #2、学生类创建对象
    student_obj=models.Student()
    #3、对象.属性中添加值
    student_obj.name='赵四'
    student_obj.age='20'
    student_obj.birthday='1999-11-11'
    student_obj.subject=sub_obg
    #4、保存
    student_obj.save()


查找


查找学生赵四的学科(正向查找)

	#1、先找到赵四
    student_obj=models.Student.objects.get(name='赵四')
    #2、赵四对应的学科属性
    subject_obj=student_obj.subject
    print(subject_obj)#直接返回的是对象
    #<Subject obj name : python>

查找学python的学生(反向查找)

# 1、找到python
    sub_obj = models.Subject.objects.get(name='python')
    #2、获取所有
    student_obj_list=sub_obj.student_set.all()
    print(student_obj_list)
    #注意:返回的是列表
    #<QuerySet [<Student: <Student obj name : 赵四>>]>

修改

(一对多时set里面不能是id)

1、反向操作:(使用set() 方法)
练习1:将赵四 修改成学java
  sub_obj = models.Subject.objects.get(name='java')
  student_obj = models.Student.objects.get(name='赵四')
  sub_obj.student_set.set([student_obj])
  # 可以修改多个学生对象。
  #sub_obj.student_set.set([obj1,obj2,obj3......])
2、正向操作:(使用save()、update()方法)
(1).使用save()
  练习1:李四转学python
  student_obj = models.Student.objects.get(name='李四')
  sub_obj = models.Subject.objects.get(name='python')
  student_obj.subject = sub_obj
  student_obj.save()
  (2).使用update() --> 比save()操作简单。
  练习1:李四转学java
sub_obj = models.Subject.objects.get(name='java')
  models.Student.objects.filter(name='李四').update(subject=sub_obj)

删除

(1). 赵四退学
	models.Student.objects.get(name='赵四').delete()
(2). python 解散,(级联删除对应的学生)
	models.Subject.objects.get(name='python').delete()



版权声明:本文为achieve_success原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。