参考链接
定义的模型类
from django.db import models
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
def __str__(self):
return self.name
class Author(models.Model):
name = models.CharField(max_length=200)
email = models.EmailField()
def __str__(self):
return self.name
#Blog-Entry(一对多,外键一般放在多的那个模型类中)
#Author-Entry(多对多)
class Entry(models.Model):
blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
headline = models.CharField(max_length=255)
body_text = models.TextField()
pub_date = models.DateField()
mod_date = models.DateField()
authors = models.ManyToManyField(Author)
number_of_comments = models.IntegerField()
number_of_pingbacks = models.IntegerField()
rating = models.IntegerField()
def __str__(self):
return self.headline
执行迁移
python manage.py makemigrations
python manage.py migrate
创建对象
我创建的对象
可以通过admin后台去创建
通过过滤器检索指定对象
def index(request):
# all()检索全部对象
Entrys=Entry.objects.all()
print(Entrys)
# filter()返回满足条件的对象(number_of_comments大于10)
fentrys=Entry.objects.filter(number_of_comments__gt=10)
print(fentrys)
# exclude()返回不满足查询条件的对象
exclutry=Entry.objects.exclude(number_of_comments__gt=10)
print(exclutry)
# 用get()获取单个对象(主键id为1)
one_entry=Entry.objects.get(pk=1) #get()获取的单个对象
print(one_entry)
one_entrylist=Entry.objects.filter(pk=1) #filter获取的是列表
print(one_entrylist)
<QuerySet [<Entry: 今天在学模型查询>, <Entry: ceshi>, <Entry: hahaha>]>
<QuerySet [<Entry: 今天在学模型查询>, <Entry: hahaha>]>
<QuerySet [<Entry: ceshi>]>
今天在学模型查询
<QuerySet [<Entry: 今天在学模型查询>]>
跨关系查询
# 跨关系查询
blog_name=Entry.objects.filter(blog__name='测试的')
print(blog_name)
# 跨关系查询反向操作
# 检索blog对象标题为‘haha’的条目(双下划线__)
bblog=Blog.objects.filter(entry__headline__contains='haha')
print(bblog)
# 跨多值关联
print('================')
# 删选出标题包含haha并且出版年分为2020的博客
mblog=Blog.objects.filter(entry__headline__contains='haha',entry__pub_date__year=2020)
# 删选出标题包含haha或者出版年分为2020的博客
mmblog=Blog.objects.filter(entry__headline__contains='haha').filter(entry__pub_date__year=2020)
print(mblog)
print(mmblog)
<QuerySet [<Entry: hahaha>]>
<QuerySet [<Blog: 测试的>]>
================
<QuerySet [<Blog: 测试的>]>
<QuerySet [<Blog: 测试的>]>
关联对象(正向查询 反向查询)
我理解的正向查询就是我查询的属性就是我所查询的数据表,也就是说,数据表里正好有我所查询的属性;反向查询就是我所查询的数据表中没有我所查询的属性字段,必须得在关联外键字段存在得那张表去查询,下面有例子可以方便了解;
print('==========关联对象=============')
# ============一对多===========
# 正向访问(Entry里有blog属性直接.就能访问)
e=Entry.objects.get(pk=2).blog
print(e)
# 反向关联(无外键对象模型名对象.有外建的表(小写)_set.all())
b=Blog.objects.get(pk=1)
print(b.entry_set.all())
# 在反向关联的基础上条件查询
print(b.entry_set.filter(headline__contains='ce'))
TEST
<QuerySet [<Entry: 今天在学模型查询>, <Entry: ceshi>]>
<QuerySet [<Entry: ceshi>]>