操蛋的Django model------select_related() 主要用于一对一和一对多

摘要:
要选择外键,需要使用两个下划线“__”进行连接。

实例:

创建表,表都是一对一,一对多

class Province(models.Model):
    name = models.CharField(max_length=10)
class City(models.Model):
    name = models.CharField(max_length=5)
    province = models.ForeignKey(Province)#province是字段名
class Person(models.Model):
    firstname  = models.CharField(max_length=10)
    lastname   = models.CharField(max_length=10)
    visitation = models.ManyToManyField(City, related_name = "visitor")
    hometown   = models.ForeignKey(City, related_name = "birth")
    living     = models.ForeignKey(City, related_name = "citizen")

2.对于一对一字段(OneToOneField)和外键字段(ForeignKey),可以使用select_related 来对QuerySet进行优化,在对QuerySet使用select_related()函数后,Django会获取相应外键对应的对象,从而在之后需要的时候不必再查询数据库了。

3.select_related() 接受可变长参数,每个参数是需要获取的外键(父表的内容)的字段名,以及外键的外键的字段名、外键的外键的外键…。若要选择外键的外键需要使用两个下划线“__”来连接。

以上例说明,如果我们需要打印数据库中的所有市及其所属省份,使用select_related的做法是:

citys = models.city.objects.select_related('province').all()
for p in citys:
print(p.province)

我们要获得张三的现居省份,可以用如下方式:(张三的外键是city,city的外键是province,即外键的外键,要用双下划线__)

zhangs = Person.objects.select_related('living__province').get(firstname=u"",lastname=u"") 
print(zhangs.living.province)

免责声明:文章转载自《操蛋的Django model------select_related() 主要用于一对一和一对多》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇我心中“用户体验”几大要素的优先级(转)Java编程的逻辑 (26)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

在数据库中使用外键和级联删除

前一阵子写了1个项目,这个项目有ios和android2个版本,都使用了sqlite数据库。数据库内容也不是太复杂,但是我们在操作时没有利用数据库的级联删除等功能,导致代码复杂,现在分析一下。 比如系统需要2个表,表Person表示人的信息, 包含personID,personName,  表Treatement表示治疗方案,包含用药名称,用药剂量,用药时...

django中时间区间过滤,排序

1.过滤下载 pip install django-filter 2.下载后注册 INSTALLED_APPS=['django_filters',] 3.导入rest_framework from django_filters importrest_framework classDoctorsFilter(rest_framework.Filter...

Django框架rest_framework中APIView的as_view()源码解析、认证、权限、频率控制

在前后端分离项目中前面我们也提到了各种认证需要自己来做,那么我们用rest_framework的时候 rest_framework也为我们提供相应的接口,rest_framework中的APIView实现了和Django原生View  as_view()一样的功能 并在此基础上实现了原生request的封装、认证、权限、视图等等功能 我们来看APIView...

Django启动过程之超级详细分析

1.执行python manage.py runserver 127.0.0.1:8000  命令 入口  manage.py    2. 进入django.core.management    __init__.py    ManagementUtility类   3.执行execute()方法  这是整个流程的关键点 代码 关键1  在django...

django实现动态菜单的方式

1、model from django.contrib.auth.models import User #django自带 class UserProfile(models.Model):   """使用django 自带的用户控制权限的用户表""" user = models.OneToOneField(User,on_delete=mode...

Django(七)

一、ModelForm操作及验证 1、class Meta:class Meta: #注意以下字段不能加逗号 model = models.UserInfo #这里的all代指所用的字段,也可以是一个列表,里面是model中的字段 fields = '__all__' # fields = ['username','user_type...