2020-12-17

使用serializer.ModelSerializer:
在主路由中导入
from rest_framework.routers import DefaultRouter
router = DefaultRouter
router.register(r’路由’,App中的类名)
urlpatterns = [
path(‘admin/’, admin.site.urls),
path(’’,include(router.urls))
]

使用局部排序:
View中导入:
from rest_framework.filters import OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend
在类中写入:
filter_backends = [DjangoFilterBackend,OrderingFilter]
filter_fields = [‘name’] 模型中的字段名
ordering_fields = [‘age’] 模型中的字段名

表结构

from django.db import models

class Publisher(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)

class Book(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)

publisher = models.ForeignKey(‘Publisher’, related_name=‘person_book’, related_query_name=‘ooxx’)
1
插入数据

Book表
id title pubtime person_id
书1 1533225600000 1
书2 1533225600000 1
书3 1534435200000 1
书4 1535644800000 2
书5 1535126400000 3

Publisher表
id name
1 出版社1
2 出版社2
3 出版社3

正向查询: 外键所在表去查另一张表,Book >> Publisher

反向查询:普通表去查外键所在的表,Publisher >> Book

正向查询,基于对象跨表查询

book_obj = models.Book.objects.first() # 取到书籍对象
book_obj.publisher.name # 书籍的出版社名字,html
book_obj.person.id # 书籍的出版社id,html

跨表查询,利用双下划线跨表查询

models.Book.objects.filter(id=1).values(‘publisher__name’) # 查询id是1的书的出版社的名字,一条双下划线就是跨一张表
models.Book.objects.filter(id=1).values_list(‘publisher__name’)

反向查询

对象查询 obj.表名_set()

publisher_obj = models.Publisher.objects.first() # 找到第一个出版社对象
ret = publisher_obj.book_set.all() # 找到第一个出版社出版的所有数
for i in ret: # 循环对象
print(i.name) # 打印出每一个书的书名

publisher_obj = models.Publisher.objects.first() # 找到第一个出版社对象
books = publisher_obj.book_set.all() # 找到第一个出版社出版的所有书
titles = books.values_list(“name”) # 找到第一个出版社出版的所有书的书名
print(titles)
因为使用了releted_name,就是用person_book代替了表字段名字
表字段person = models.ForeignKey(Person, related_name=‘person_book’)
所以这一这样写
books = publisher_obj.person_book.all()
titles = books.values_list(‘name’)
print(titles)
如果表字段person = models.ForeignKey(Person, related_name=‘person_book’,related_query_name=“xxoo”)
related_query_name=“xxoo”,这里表示跨表查询xxoo代替表的名字book
books = publisher_obj.ooxx_set.all()

基于双下划线

ret = models.Publisher.objects.filter(id=1).values_list(‘person_book__name’)
person_book是通过releted_name给对应关系起的名字,通过person_book就找到了关联的表,再通过双下划线找到name
print(ret)

附带django里面脚本的代码

import os

if name == ‘main’:

加载Django项目的配置信息

os.environ.setdefault(“DJANGO_SETTINGS_MODULE”, “项目名.settings”)

导入Django,并启动Django项目

import django
django.setup()

from app01 import models

查询id为1的出版社出版的所有书的name

ret = models.Publisher.objects.filter(id=1).values_list(‘person_book__name’)
print(ret)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值