django多对多关系及博客项目创建类模型

一、多对多


1.关系表


在这里插入图片描述


2.模型创建


class Person(models.Model):
    # id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32,verbose_name="姓名")
    age = models.IntegerField(verbose_name="年龄")
    height = models.DecimalField(max_digits=5,decimal_places=2,verbose_name="身高",null=True)
    birthday = models.DateField(verbose_name="生日",auto_now=True)

    def __str__(self):
        return str(self.name)

    class Meta:
        db_table = 'person'
        verbose_name = "用户"
        verbose_name_plural = verbose_name
        # ordering= ['-age','id','name']

class Teacher(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField(default=0)
    gender = models.CharField(max_length=8)
    person = models.ManyToManyField(to=Person)
    class Meta:
        db_table = 'teacher'

3.查看数据库


在这里插入图片描述


二、多对多操作


1.增加


增加老师数据

    # 新学员  秦秦 想学 laozhang 课  create  正向操作
    # teacher_obj = Teacher.objects.filter(name='laozhang').first()
    # teacher_obj.person.create(name="秦秦",age=16,height=192)
    # 老学员张三  想学 laowang 的课  创建关系的操作   正向操作
    # teacher_obj = Teacher.objects.filter(name='laowang').first()
    # person_obj = Person.objects.filter(name="zhangsan").first()
    # teacher_obj.person.add(person_obj)

    ## 反向操作
    teacher_obj = Teacher.objects.filter(name="laoliu").first()
    person_obj = Person.objects.filter(name="秦秦").first()
    person_obj.teacher_set.add(teacher_obj)

2.查询


def manytomanyget(request):
    ## 正向  反向
    
    ## 正向查询
    #  查到老师信息,寻找这个老师教的所有学生
    # teacher_obj = Teacher.objects.filter(name='laoliu').first()
    # person = teacher_obj.person.all()
    # print (person)
    ## 查到学生的信息,寻找该学生的老师
    ## 反向查询
    person_obj = Person.objects.filter(name='秦秦').first()
    teacher_obj = person_obj.teacher_set.all().values()
    print (teacher_obj)

    return HttpResponse("多对多查询")

3.更改


def manytomanyupdate(request):
    # 修改老刘交的学生    10 3   改成  老刘只交id为 1 2 3 4 5 学生
    # 正向  从外键所在表 -》 关联表    teacher -》 person
    # 第一种
    # teacher_obj = Teacher.objects.filter(name="laoliu").first()
    # teacher_obj.person.set([1,2,3,4,5])
    # 第二种
    # teacher_obj = Teacher.objects.filter(name="laoliu").first()
    # person1 = Person.objects.filter(name="java").first()
    # person2 = Person.objects.filter(name="秦秦").first()
    # ## set 后面要放一个 列表,列表中可以是id 还可以是 对象
    # teacher_obj.person.set([person1,person2])

    ## 反向修改
    # 第一种
    # person_obj = Person.objects.filter(name='java').first()
    # person_obj.teacher_set.set([2])
    # 第二种   放对象   
    person_obj = Person.objects.filter(name='java').first()
    teacher1 = Teacher.objects.filter(name="laoliu").first()
    teacher2 = Teacher.objects.filter(name="laowang").first()
    person_obj.teacher_set.set([teacher1,teacher2])

4.删除


   # remove() 解除对象之间的关系
    # 正向操作
    # 秦秦同学 不学老张的课了
    # person_obj = Person.objects.filter(name='秦秦').first()
    # teacher_obj = Teacher.objects.filter(name="laozhang").first()
    # teacher_obj.person.remove(person_obj)

    # 反向操作
    # teacher_obj = Teacher.objects.filter(name="laoliu").first()  ## 查询教师数据
    # person_obj = Person.objects.filter(name='zhangsan').first()  ## 查询学生数据
    # person_obj.teacher_set.remove(teacher_obj)



    # delete() 删除对象数据,以及对象之间的关系
    # laoliu 离职
    # Teacher.objects.filter(name="laoliu").first().delete()

    #  java 同学 退学了
    Person.objects.filter(name="java").first().delete()

三、聚合查询 avg sum max min count


通过aggregate调用聚合函数

aggregate () 是一个queyset的方法,意思是:返回一个包含数据的键值对的字典

键名:聚合值的表示符号,值:聚合函数计算的结果。

def jttest(request):
    data = Person.objects.all().aggregate(Avg("age"))
    print(data)
    data = Person.objects.all().aggregate(avg_age = Avg("age"),sum_age = Sum("age"))
    print (data)

    return HttpResponse("集合查询")

四、F对象 Q对象


F对象: 用于比较同一个模型中的两个字段的值

Q对象

用于处理多条件中的逻辑关系 and or not

def Qtest(request):

    ###   and
    data = Book.objects.filter(num=10,salled=100).all()
    print (data)
    # and 关系
    data = Book.objects.filter(Q(num__gt=10)&Q(salled=100)).all()
    print(data)
    ## or
    data =Book.objects.filter(Q(num__gt=10)|Q(salled=100)).all()
    print (data)
    ## not
    data = Book.objects.filter(~Q(num=10)|~Q(salled=100)).all()
    print (data)

    return HttpResponse("Q obj test")

五、博客项目的操作


ORM 提供数据,创建类模型

class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    gender = models.CharField(max_length=8)
    email = models.CharField(max_length=32)

    def __str__(self):
        return self.name

    class Meta:
        db_table='author'


class Type(models.Model):
    name = models.CharField(max_length=32)
    description = models.TextField()
    def __str__(self):
        return self.name

    class Meta:
        db_table='type'


class Article(models.Model):
    title = models.CharField(max_length=32)
    date = models.DateField(auto_now=True)
    content = models.TextField()
    description = models.TextField()
    author = models.ForeignKey(to=Author,on_delete=models.SET_DEFAULT,default=1)
    type = models.ManyToManyField(to=Type)

    def __str__(self):
        return self.title
    class Meta:
        db_table='article'
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值