一.查询
Student.objects.first() #第一个
Student.objects.last() #最后一个
Student.objects.exclude(name = 'lucy') #排除这个
res = Student.objects.values('name')
res[2]['name']
还可以通过指定查询(字典操作),只能查询name
res = Student.objects.only('name')
res[2].sex
对象操作,对象里面的东西都可以查询
res = Student.objects.order_by("age") # 正序
res = Student.objects.order_by("-age") # 反序
Student.objects.filter(pk__in=[1,3,4])
Student.objects.filter(sex__in='01')
res = Student.objects.filter(name__icontains='l').only('name')
res1 = Student.objects.filter(pk__in = res).only('name')
子查询
Student.objects.filter(age__gt=34)
gt是大于,lt是小于
Student.objects.filter(age__range=(100,300))
这是范围
from django.db.models import Count
res = Student.objects.values("sex").annotate(ren=Count('sex'))
这是分组聚合。
二.表关系的实现
from django.db import models
# Create your models here.
class Student(models.Model):
name = models.CharField('姓名',max_length=20)
age = models.SmallIntegerField('年龄',null=True)
sex = models.SmallIntegerField('性别',default=1,unique=True)
qq = models.CharField('qq',max_length=20,unique=True)
phone = models.CharField('电话',max_length=20,unique=True)
c_time = models.DateTimeField('创建时间', auto_now_add=True)
grade = models.ForeignKey("Grade",on_delete=models.SET_NULL,null=True)
def __str__(self):
return "{}-{}".format(self.name, self.sex)
class StudentDetail(models.Model):
collage = models.CharField('学院', max_length=20)
student = models.OneToOneField('Student', on_delete=models.CASCADE) # 关联表 #
class Grade(models.Model):
name = models.CharField("班级名称", max_length=20)
num = models.CharField("班期",max_length=20)
class Course(models.Model):
name = models.CharField("课程名称",max_length=20)
students = models.ManyToManyField('Student')
这就是几种表关系。
这里最重要的一个点就是回滚了。
因为我们的建立的学生表和课程表之间比较复杂,所以我们如果如果创建的时候直接通过课程表和学生表建立多对多的关系的时候,编译器就会自动的给我们建立中间表,但是我们想要创建自己的中间表的话我们就需要通过回滚的方式来解决这个问题
from django.db import models
# Create your models here.
class Student(models.Model):
name = models.CharField('姓名',max_length=20)
age = models.SmallIntegerField('年龄',null=True)
sex = models.SmallIntegerField('性别',default=1,unique=True)
qq = models.CharField('qq',max_length=20,unique=True)
phone = models.CharField('电话',max_length=20,unique=True)
c_time = models.DateTimeField('创建时间', auto_now_add=True)
grade = models.ForeignKey("Grade",on_delete=models.SET_NULL,null=True)
def __str__(self):
return "{}-{}".format(self.name, self.sex)
class StudentDetail(models.Model):
collage = models.CharField('学院', max_length=20)
student = models.OneToOneField('Student', on_delete=models.CASCADE) # 关联表 #
class Grade(models.Model):
name = models.CharField("班级名称", max_length=20)
num = models.CharField("班期",max_length=20)
# class Course(models.Model):
# name = models.CharField("课程名称",max_length=20)
# students = models.ManyToManyField('Student', through='Enroll')
#
#
# # 中间表
# class Enroll(models.Model):
# student = models.ForeignKey('Student', on_delete=models.CASCADE)
# Course = models.ForeignKey('Course', on_delete=models.CASCADE)
# pay = models.FloatField('缴费金额', default=0)
# c_time = models.DateTimeField('报名时间', auto_now_add=True)
先注释最后两个表的代码,然后生成迁移,命令之前的博客有写过,生成迁移后,再把注释的代码输入,再次生成迁移,然后输入代码
python manage.py migrate 加上app名 和 对应文件名就ok
python manage.py migrate student 0001
但是记住要把之后的0002删除掉,之后就可以写自己的表了。