django2外键,F表达式,Q表达式

一对多

环境

两个类:书的类别和文章,一片文章只能有一个作者,一个作者可以有多个文章,这之间组成了一对多的关系

class Category(models.Model):
    category = models.CharField(max_length=100)

    def __str__(self):
        return self.category



class Article(models.Model):
    title = models.CharField(max_length=20,verbose_name='书名')
    info = models.TextField(verbose_name='内容')
    author = models.CharField(max_length=10, verbose_name='作者')
    f = models.ForeignKey(to='Category',on_delete=models.CASCADE)#如果不想用article_set这种形式查找,可以使用related_name='articles',那么在视图one_to_many函数中就可以使用articles = category.articles.all()

添加文章

def add_article(request):
    article = Article(title='钢铁是怎样炼成的',info='不知道',author='疯子')
    article.f = Category.objects.get(id=1)
    article.save()
    return HttpResponse('添加文章成功')

 

通过书的类型查找文章

def one_to_many(request):
    category = Category.objects.first()
    articles = category.article_set.all()#all可以换成filter或者first
    for i in articles:
        print(i.title)
        print(i.author)
        print(i.content)
    return HttpResponse('ok')

 

 

一对一

环境

如果一张表里面字段非常都可以考虑把一张表拆成2张表,这样在查询的时候比在一张表上查询速度快,例子:一个用户表,一个用户扩展信息表,这是一对一个关系,一个用户只能对应一个扩展信息,同样的道理,一个用户扩展信息只能对应一个用户

 

models.py内容

class Users(models.Model):
    name = models.CharField(max_length=10)
    # def __str__(self):
    #     return 'name:%s' % self.name

class Users_Extend(models.Model):
    school = models.CharField(max_length=100)
    telephone = models.CharField(max_length=11)
    extend_info = models.OneToOneField('Users', on_delete=models.CASCADE)

 

view视图

#通过用户查看用户的扩展信息
def
one_to_one(request): # users = Users(name='疯子') # users.save() # extend = Users_Extend(school='交通大学',telephone=120) # extend.extend_info_id = 1 # extend.save() extend = Users_Extend.objects.first() print(extend.extend_info.name) return HttpResponse('添加用户成功')

 

view视图

#通过扩展信息查看用户
def one_to_one(request):
    users = Users.objects.first()
    print(users.users_extend)
    return HttpResponse('添加用户成功')

 多对多

环境

一个文章可以有多个标签,一个标签也可以有多个文章,这样就形成了多对多的关联表,如果是多对多的表关联,就必须存在第三章表

models.py内容

class Article(models.Model):
    title = models.CharField(max_length=20,verbose_name='书名')
    info = models.TextField(verbose_name='内容')
    author = models.CharField(max_length=10, verbose_name='作者')
    # f = models.ForeignKey(to='Category',on_delete=models.CASCADE,related_name='articles')
    tag = models.ManyToManyField('Tag')
    def __str__(self):
        return '(id:%s   title:%s   info:%s)' % (self.id, self.title,self.info)

class Tag(models.Model):
    tag = models.CharField(max_length=100)

    def __str__(self):
        return 'tag:%s' % self.tag

 

view视图

def many_to_many(request):
    # 插入一篇文章
    # article = Article(title='水浒传',info='武松打虎',author='施耐庵')
    # article.save()
    
    # 取出一个标签对象
    # tag = Tag.objects.first()
    
    # 在标签里添加文章
    # tag.article_set.add(article)
    # tag.save()
    #
    # print(article,tag)
    # return HttpResponse('写入文章分类成功')

    #查看第一个标签下面有什么文章
    tag = Tag.objects.first()
    article = tag.article_set.all()
    print(article)

    #查看一个文章有什么标签
    article = Article.objects.first()
    tags = article.tag.all()
    print(tags)
    return HttpResponse('查看文章分类成功')

 

 

F表达式

如果有一个场景,将运维部门所有的员工工资全部涨1000块钱,那么传统的方法如下:这样的方式效率是比较低的,这种方式需要把所有员工的工资查找出来放入到python内存当中,然后循环每一个员工的工资做+=1000的操作,然后在保存回数据库当中,F表达式是用来优化ORM数据库的

 

models.py内容

class Employee(models.Model):
    name = models.CharField(max_length=10)
    salary = models.IntegerField()

 

传统方式

def employee(request):
    # 传统加工资方式
    users = Employee.objects.all()
    for user in users:
        user.salary += 1000
        user.save()

F表达式

def employee(request):
    # F表达式
    # Employee.objects.update(salary=F("salary")+1000)
    Employee.objects.filter(salary__lt=2200).update(salary=F("salary")+1000)
    return HttpResponse('涨薪成功')

 

 

Q表达式

如果要查找工资是2200并且姓名是冯明可以用:Employee.objects.filter(salary=2200,name='冯明'),那么如果我想查找工资是2200或者姓名为肖龙的数据呢?这就需要借助Q表达式,Q表达式可以表示或的关系,具体实现如下:

def employee(request):
    # Q表达式
    res = Employee.objects.filter(salary=2200,name='冯明')
    # res = Employee.objects.filter(Q(salary=2200)|Q(name='肖龙'))
    print(res.values())
    return HttpResponse('涨薪成功')

 

ORM转变的sql语句

from django.db import connection#查看sql语句的方法
from django.shortcuts import render,redirect,reverse
from .models import Article,Category,Users,Users_Extend,Tag,Employee
from django.http import HttpResponse
from django.db.models import F
from django.db.models import Q



print(connection.queries)#查看sql语句

 

转载于:https://www.cnblogs.com/fengzi7314/p/10961576.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值