随笔- 310  文章- 1  评论- 0  阅读- 86066 

创建模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from django.db import models
  
#学生类
class  Student(models.Model):
    id = models.AutoField(primary_key=True)
    sname = models.CharField(max_length=20)
  
    # 一对多外键设置,'多'的模型类设置外键,注意需要带参数on_delete
    cid = models.ForeignKey('Class',on_delete=models.CASCADE)
  
    # 一对一外键设置,哪个模型设置外键都可以,注意需要带参数on_delete
    detail = models.OneToOneField('StudentDetail',on_delete=models.CASCADE)
  
#学生信息类
class StudentDetail(models.Model):
    id = models.AutoField(primary_key=True)
    height = models.IntegerField()
    email = models.EmailField()
    memo = models.TextField(max_length=100)
  
#班级类
class Class(models.Model):
    id = models.AutoField(primary_key=True)
    cname = models.CharField(max_length=20)
    cdata = models.DateField()
  
#老师类
class Teacher(models.Model):
    id = models.AutoField(primary_key=True)
    tname = models.CharField(max_length=20)
  
    #多对多外键设置,哪个模型类创建外键都可以,注意没有on_delete参数
    cid = models.ManyToManyField(Class)

  

在mysql数据库中生成对应表格

1
2
3
4
5
#创建迁移文件
python manage.py makemigrations       
 
#应用迁移文件
python manage.py migrate

  

操作

注:当ForeignKey字段设置null=True时,此时就有clear()和remove()方法

一对一

1
2
3
4
5
6
7
8
Student ---> StudentDetail
#正向
Student.objects.filter(id__gt=2)[0].detail
StudentDetail.objects.filter(student__id__gt=1)
 
#反向
StudentDetail.objects.get(id=1).student
Student.objects.filter(detail__id__exact=1)

 

一对多   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Student ---> Class
add(obj1, obj2, ...)添加一指定的模型对象到关联的对象集中
create(**kwargs)创建一个新的对象,将它保存并放在关联的对象集中。返回新创建的对象
remove(obj1, obj2, ...)从关联的对象集中删除指定的模型对象
clear()从关联的对象集中删除所有的对象。
 
Student ---> Class
s1=Student(**data)
s1.save()
c1 =Class(**data1)
c1.save()
c1.student_set.add(s1)
c1.student_set.create(**data)
 
a1 = Student.objects.filter(id=1)
c1.student_set.remove(a1)
c1.article_set.clear()
 
 
#正向
  Student.objects.get(id=1).cid     
  Class.objects.filter(student__id=1
 
 #反向
    Class.objects.get(id=1).student_set.all()   #副表调用主表信息,使用   主表名(全小写)__set
    Student.objects.filter(cid__id=1

 多对多 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Teacher --> Class
# 正向
Teacher.objects.get(id=1).cid.all()
Class.objects.filter(teacher__id=1)
 
# 添加
Teacher.objects.get(id=5).cid.add(*Class.objects.filter(id__gt = 3))
#移除
Teacher.objects.get(id=5).cid.remove(*Class.objects.filter(id__gt=1))
#清空对象关系
Teacher.objects.get(id=5).cid.clear()
#重新设置关系     #添加新关系,删除多余关系
Teacher.objects.get(id=5).cid.set(list(Class.objects.filter(id__gt=5)) )#参数为一个可迭代对象就可以
 
#反向
Class.objects.get(id=1).teacher_set.all()
Teacher.objects.filter(Q(cid__id=1) | ~Q(cid__id=2))

  

 

 posted on   boye169  阅读(79)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示