创建模型
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 )) |
分类:
python / django
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统