您的位置:首页 > 编程语言 > Go语言

Django model

2015-05-31 17:47 447 查看

多表关联查询 - 计算机的世界主要就是操作数据,所以orm一定要使用好

学习使用Django,重要的一块就orm。

初次使用感觉总体还是很好用的。主要是Django的文档比较全。

只要多看看文档,一切问题还是都能解决的。

对于初学者而言,其中最难的就是多表关联查询,以及列表或group返回关联查询的结果。

差不多用了一天的时间,粗略看了Django关于model的文档,真是大而全呀。

> 在QuerySet使用关联表的字段名字规则是

Django offers a powerful and intuitive way to “follow” relationships in lookups, taking care of the SQL JOINs for you automatically, behind the scenes. To span a relationship, just use the field name of related fields across models, separated by double underscores, until you get to the field you want.

最重要的是这种
__
可以无限制的用很多个,这取决于你的数据库结构。

查询时,一对多的关系,直接使用相应model名的小写加
__
就可以查询相应的字段了,不需要加
_set


> 查到后取值得字段名字

取值就简单些,直接把字段名作为属性就可以取值了。如: entry.blog.name

一对多的关系就必须在名字后加上
_set
, 如
blog.entry_set.all()


>:关于一对多或多对多的关系链,查找的时候一定要理解“Spanning multi-valued relationships”这段的意思,被给自己留下查询的隐患。

详见:Django文档Spanning multi-valued relationships段落

这里就不再做叙述了。

However, unlike the behavior when using filter(), this will not limit blogs based on entries that satisfy both conditions. In order to do that, i.e. to select all blogs that do not contain entries published with “Lennon” that were published in 2008, you need to make two queries:

[code]Blog.objects.exclude(
    entry=Entry.objects.filter(
        headline__contains='Lennon',
        pub_date__year=2008,
    ),
)


> mysql的distinct使用

因为每个数据库背后的实现逻辑不通,造成orm的
distinct
的使用方式也不同,碰到类似题主要还是查看Django文档,结合Google搜索。

使用样例:
Para.objects.values('type').distinct().order_by('type').values_list('type', 'type')


或:
Para.objects.values_list('type').distinct().order_by('type').values_list('type', 'type')


values
values_list
都是
QuerySet
子类,使用方法类似,但末尾还要再用
values_list
取值一次,以便后面当作转化成list使用。Django是这样实现的,你就要这样使用。

其实上面也可以自己写python代码实现如:

[(i, i) for i in sorted(set(Para.objects.values_list('type', flat=True)))]


但是这样会增加服务端的压力

> 在model中写方法,而且还能链式使用

这里提到的功能很是好用。可以用来写把查到的数据写成字典或列表的方法, 进而把数据传到前端使用。

查看文档 django-model-utils documentation
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: