F查询
生成多表的准备工作已经在博客[Django-ORM模型层语法(四)之多表操作准备工作]中写了,各位可以点击下方的链接,跟着操作:
app01_book表 :
id | title | price | publish_date | publishs_id |
---|---|---|---|---|
1 | 红楼梦 | 66 | 2020-02-02 | 2 |
2 | 聊斋 | 100 | 2020-02-02 | 1 |
3 | 论语 | 200 | 2020-02-02 | 2 |
4 | 三国演义 | 300 | 2020-02-02 | 1 |
5 | 老子 | 400 | 2020-02-02 | 2 |
在Book表中添加新的字段:reserve,sales
models.py
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8, decimal_places=2)
publish_date = models.DateField(auto_now_add=True)
# 库存
reserve = models.IntegerField(default=1000)
# 卖出
sales = models.IntegerField(default=1000)
# 一对多
publishs = models.ForeignKey(to='Pulish')
# 多对多
authors = models.ManyToManyField(to='Author')
def __str__(self):
return self.title
Terminal
python manege.py makegirations
python manage.py migrate
app01_book表 :
id | title | price | publish_date | publishs_id | reserve | sales |
---|---|---|---|---|---|---|
1 | 红楼梦 | 66 | 2020-02-02 | 2 | 800 | 1000 |
2 | 聊斋 | 100 | 2020-02-02 | 1 | 200 | 1000 |
3 | 论语 | 200 | 2020-02-02 | 2 | 1000 | 500 |
4 | 三国演义 | 300 | 2020-02-02 | 1 | 1000 | 800 |
5 | 老子 | 400 | 2020-02-02 | 2 | 1200 | 400 |
app01/tests.py
"""
当你只是想测试django中的某一个py文件内容 那么你可以不用书写前后端交互的形式
而是直接写一个测试脚本即可
脚本代码无论是写在应用下的tests.py还是自己单独开设py文件都可以
"""
# 测试环境的准备 去manage.py中拷贝前四行代码 然后自己写两行
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm1.settings")
import django
django.setup()
# 在这个代码块的下面就可以测试django里面的单个py文件了
# 所有的代码都必须等待环境准备完毕之后书写
from app01 import models
# F查询
'''
能够帮助你直接获取到表中某个字段对应的数据
'''
from django.db.models import F
# 1.查询卖出数大于库存数的书籍
res = models.Book.objects.filter(sales__gt=F('reserve'))
print(res)
# 2.将所有书籍的价格提升500元
models.Book.objects.update(price=F('price')+500)
# 3.将所有书的名称后面加上'爆款'两个字
'''
在操作字符类型的数据时,F不能直接做到字符串的拼接
'''
from django.db.models.functions import Concat
from django.db.models import Value
models.Book.objects.update(title=Concat(F('title'),Value('爆款')))