Django与一对多CRUD操作

Django与一对多CRUD操作

外键类型在ORM中用来表示外键关联关系,一般吧ForcignKey字段设置在一对多中的【多】的一方。

首先构建模型类
学科与学生
# 学科和学生是一对多关系
#学科模型类
class Subject(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    price = models.IntegerField()

    def __str__(self):
        return '<obj: name:{}>'.format(self.name)

# 学生模型类
class Student(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    #to: 表示要关联的表格
    #on_delete:表示:删除表格时的策略
    # CASCADE:表示删除关联数据,与之关联的也删除
    subject = models.ForeignKey(to='Subject',on_delete=models.CASCADE)

    def __str__(self):
        
        return '<obj: name:{}>'.format(self.name)

建立完模型类同步数据库,并刷新。

一对多CRUD操作

R:read 查询
def test2(request):
    # 查询
    # 张三对应的学科
    # ⑴使用id
    student_obj = models.Student.objects.get(name='张三')
    subject_obj = models.Subject.objects.get(id=student_obj.subject_id)
    print(subject_obj)
    # ⑵使用外键
    student_obj = models.Student.objects.get(name='张三')
    subject_obj = student_obj.subject
    print(subject_obj)

    # 查看学python的学员
    # 正向查询:从 有关系字段(建立连接的字段) 到 没有关系字段 的是正向查询。
    # 反向查询:从 没有关系字段 到 有关系字段 的是反向查询。默认使用 【类名小写_set】来查询。
    subject_obj = models.Subject.objects.get(name='python')
    result = subject_obj.student_set.all()
    print(result)
    
    
    return HttpResponse('一对多 CRUD操作')

C:create 增加
def test2(request):
    # 增加
    # 新增学员 老马 学python
    # ⑴
    subject_obj = models.Subject.objects.get(name='python')
    student_obj = models.Student()
    student_obj.name = '老马'
    # student_obj.subject = subject_obj #赋值对象 或下面一种方法
    student_obj.subject_id = subject_obj.id #赋值id
    student_obj.save()
    # ⑵
    models.Student.objects.create(
        name='李二',
        subject=subject_obj
    )

    #java 学科 新增一个学员 老七 (反向)
    subject_obj = models.Subject.objects.get(name='java')
    subject_obj.student_set.create(
        name = '老七'
    )
    
    
    
    return HttpResponse('一对多 CRUD操作')
D:delete 删除
def test2(request):
    # 删除
    # 删除 id 为6
    models.Student.objects.get(id=6).delete()
    # 删除带 七 的
    models.Student.objects.filter(name__contains='七').delete()
    # 级联删除
    # Java 学科关闭 subject表 Java删除 student表对应学 Java的学生删除
    models.Subject.objects.filter(name='java').delete()
   
    
    return HttpResponse('一对多 CRUD操作')
U:update 修改
def test2(request):
    # 修改
    # 张三转学Java
    # ⑴
    student_obj = models.Student.objects.get(name='张三')
    subject_obj = models.Subject.objects.get(name='java')
    student_obj.subject = subject_obj
    student_obj.save()
    
    # ⑵ 使用update
    subject_obj = models.Subject.objects.get(name='java')
    models.Student.objects.filter(name='李四').update(subject=subject_obj)


    # 反向
    student_obj = models.Student.objects.get(name='老马')
    subject_obj = models.Subject.objects.get(name='java')
    subject_obj.student_set.set([student_obj])

    student_obj = models.Student.objects.get(name='李四')
    student_obj1 = models.Student.objects.get(name='老马')
    subject_obj = models.Subject.objects.get(name='python')
    subject_obj.student_set.set([student_obj,student_obj1])
    
    
    return HttpResponse('一对多 CRUD操作')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值