Django之orm一对多和多对多查询
Django---->orm一对多和多对多查询
1.我们需要设置一个子路由
《1》在主路由中
from django.contrib import admin
from django.urls import path,include #此处加上include。
urlpatterns = [
path('admin/', admin.site.urls),
path('app1/', include('app1.urls')), #把链接指向app1中的urls中。
]
《2》我们在app1中新建一个urls.py文件
from django.contrib import admin
from django.urls import path
from app1 import views
urlpatterns = [
path('index/', views.index),
]
《3》其次再在app1中新建temolates文件夹再在其中新建一个app1文件(为了防止有两个app时,当我们的导入顺序不一样而识别错误)。之后我们可在其中写如我们的html文件
2.我们来在models.py文件中写入新建数据库表格
《1》
from django.db import models
# Create your models here.
class Subject(models.Model):
name = models.CharField(max_length=32)
price = models.IntegerField()
def __str__(self):
return "{}--{}".format(self.name, self.price)
class Student(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
phone = models.CharField(max_length=32)
subject = models.ForeignKey(to='Subject', on_delete=True)
def __str__(self):
return "{}---{}".format(self.name, self.age)
class Teacher(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
phone = models.CharField(max_length=32)
salary = models.CharField(max_length=32)
student = models.ManyToManyField(to='Student')
def __str__(self):
return "{}---{}".format(self.name, self.age)
写完后在Terminal写入python manage.py makemigrations这个命令是记录我们对models.py的所有改动。python manage.py migrate 命令时 这条命令的主要作用就是把这些改动作用到数据库也就是执行migrations里面新改动的迁移文件更新数据库
《2》我们在admin.py文件中写入如下代码
from django.contrib import admin
from app1.models import Student,Subject,Teacher
# Register your models here.
admin.site.register(Subject)
admin.site.register(Student)
admin.site.register(Teacher)
再在Terminal中写入 python manage.py createsuperuser 根据步骤来建立admin登录用户。这样我们可以更好的去给数据库添加内容。
网页显示的是英文,我们在setting的107行把en-us改成zh-hans就可以变成中文了。
添加完数据后后我们就可以来进行一些操作。
一对多的查询,eg:一门科目有多个学生选择
from django.shortcuts import render
from app1 import models
# Create your views here.
def index(request):
#一对多查询 subject---》student
#查询出吴弟弟学的学科 ,正向查询
student_obj = models.Student.objects.get(name = '吴弟弟')
# print(student_obj)
subject_obj = student_obj.subject
# print(subject_obj)
#查询出python学科对应的学生
python_obj = models.Subject.objects.get(name = 'python')
# python_list = models.Subject.objects.filter(name = 'python')
# print(python_obj) #python--20300
# print(python_list) <QuerySet [<Subject: python--20300>]>
student_list = python_obj.student_set.all()
#print(student_list) #<QuerySet [<Student: 吴弟弟---22>, <Student: 刘德华---45>]>
#多对多
#查询波老师教过的学生 正
bo_obj = models.Teacher.objects.get(name='波老师')
student_list = bo_obj.student.all()
print(student_list)
#查询鬼谷子被谁教过 反
didi_obj = models.Student.objects.get(name='吴弟弟')
teacher_list = didi_obj.teacher_set.all()
print(teacher_list)
return render(request, 'app1/index.html', locals())