django 模型高级用法

from django.db import models

class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.CharField(max_length=50)
    website = models.URLField()

    def __unicode__(self):
        return self.name

class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField()

    def __unicode__(self):
        return u'%s %s' % (self.first_name, self.last_name)

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()

    def __unicode__(self):
        return self.title

1 外键 高级用法

正常用法: b = Book.object.all() 拿到全部
拿到某个值 b = Book.object.get(id = 50)
那么拿到这个书的出版商: b.publisher 就可以 

那么反向通过出版商找书籍呢? easy
p = publisher.object.get(name = leisen media)
p.book_set.all 就能拿到这个出版商出的书
你可以对其进行分割  p.book_ser.filter(price__gt=100)
p.book_set.filter(name__icontains='django')  

2 多对多的用法和外键一样

[3 模型自定义函数,可以把一些常用的查询写成函数][1]

class BookManager(models.Manager):
def title_count(self, keyword):
return self.filter(title__icontains=keyword).count()

表设计规范

表必须有主键

每一个字段都是原子值,不可再分割

确保每一列都和主键直接相关

一个表中只存一种数据,不要把多种数据放在一个表中

一个字段只有一个含义

总是包含创建日期,和修改日期,最好都是datatime

不用复杂类型,int char 就够了,

不需要的字段,不要删除,只是标示

高手- 传授原则

总体原则:

  • 先讲原理,再谈技术
  • 先讲全局,再谈细节
  • 善用类比
  • 尽量精简,只说用到的

当你尝试向其他人介绍一个知识点的时候,你最好遵循以下步骤:

  我们拿Linux 基础来举例

1. 先说明这个为什么需要这个技术,

     之所以要学习Linux,是因为我们的平时操作的服务器一般是远程的,没有一个像我们电脑桌面一样的操作界面,我们当然无法使用鼠标点击下就能控制服务器,所以只能通过敲一行一行的命令来操作。

2. 和其他技术有什么联系

     我们开发的程序一般最终都会部署到使用Linux 作为操作系统的服务器上,所以我们要像搭建自己的程序,最好需要掌握一点linux, 我们部署我们的程序,需要和解释器(代码翻译),数据库,web服务器,一起才能形成一个可以对外服务的应用。这些都是安装在linux服务器上的一个一个的软件。

3. 核心工作原理是什么,其实就是解释套路的过程。

     我们打开操作系统提供的一个软件(终端), 系统能识别我们根据特定格式输入的命令。 比如:cd + 路径 代表你想进入某个文件夹,ls 表示你想显示当前路径下所有的文件,touch + 文件名 表示你想创建一个新文件, 其实就是一一个个的代号。uwsgi --ini uwsgi.ini  ,前面的uwsgi 代表你要执行的程序,--ini 是参数,uwsgi.ini 是执行的文件,基本所有的命令都是这个套路。

4. 实例演示,根据上面说到的套路边演示,边说明。

     在终端上敲几个命令,边敲,边解释,并展示效果,可以先简单,再复杂。比如: ssh -u root -p 

5. 一定再让大家自己动手敲一边。并监督和解惑

好了,总体来说,每个知识点都使用上面五个步骤来一遍,确保大家都掌握,并记得告诉大家,如果想进一步提升,应该去哪里看文档。

知识点分裂

知识点总结

大家好,我真的非常想办好这个社区,我希望在这篇文章里把我们希望掌握的全部知识点全部分开,这样我们各有专供,分别学习,然后互相传授。

下面是我对python 网页开发的知识点分类,我个人能传授其中大部分。
我还需要数据分析的知识点分类,和机器学习的知识点分类。

Linux 基础

  1. 基本动作命令
  2. 基本安装命令
  3. 基本编辑命令

Python 基础

  • 运算符,数据类型,变量,循环,类。

简单协议 HTML JSON XML

  • 前端基础: HTML CSS Javascript

数据库基础 Mysql

  • 数据库类型
  • 主流数据库,mysql, MongoDB,
  • 特殊数据库 Redis

Flask 基础

  • 工作模式
  • 最小可运行代码示例

Django 基础

  • 工作模式
  • 最小可运行代码示例

Vue 基础

  • 工作模式
  • 最小可运行代码示例

uwsgi 和 nginx 基础

  • 工作模式
  • 标准配置方案

高手-编程 co_learning 组织

enter image description here

‘高手’是一个线下co leaning 学习编程的组织, 这里的高手是‘高抬贵手’的简写,因为编程学习最重要的就是多动手,好吧有点绕,但是你懂的对吧..


概述:我们目前主要的编程语言是 python,前端语言是Vue, 学习方向是 网页APP开发,数据分析,算法,机器学习,


目标: 通过定期的线下小组一起学习,讨论来迅速提高自己的编程水平和工作技能,原理是被广为推崇的 co-learning 理论。


特色:

  • 快速的学习,慢就意味者放弃,我们尝试让任何人在短时间内掌握初级技能,建立起信心
  • 有趣的学习,枯燥意味者放弃,我们尝试让学习的过程变得更轻松
  • 分级制度,(来自电影分级),我们尝试让不同级别的成员分开学习

参入方式:

有两种角色:1 司机 2 乘客

  1. 司机负责决定学习目标,制定学习内容,引导学习过程。/ 每个人都可以成为司机,只要你有某个知识点,你觉得你掌握都不错
  2. 乘客负责听,和按照司机的流程走完全程。
  • 费用:50/次, 其中30左右是买咖啡的,因为占别人地方不能不买东西吧,多的费用给司机,目的是给司机制造压力..希望精心准备课程内容
  • 地点:某个咖啡馆,每次活动前决定
  • 参与人数:每次4/5人

    扫码 加我,然后拉你入群

enter image description here

‘Master’ is an offline co leaning programming organization. The master in Chinese is ‘高手’ could mean “high hand” because the most important thing in programming learning is get your hand dirt… Well, it’s kind went south.., but you got it right?

Overview: Our current major programming language is python, the front-end language is Vue, and the direction is Web application development, data analysis, algorithms, machine learning,

Goal: Quickly improve your programming skills and working skills through regular offline group learning and discussion. The principle is the co-learning theory which is widely respected.

Features:

Fast learning, slow means giving up, we try to make anyone’s skills in a short period of time and build confidence Fun learning, boring means give up, we try to make the learning process easier Grading system (from movie rating), we try to put members in different levels learn separately Participation method: There are two roles: 1 driver 2 passengers

The driver is responsible for deciding the learning objectives, formulating learning content, and guiding the learning process. Passengers are responsible for listening and follow the driver’s procedures to complete the journey.

Cost: 50RMB/times, about 30RMB is buy a coffee for yourself ,cause we do it on coffee shop.. if there is more, we leave it to driver. the purpose is to make the pressure on the driver.. so he can prepare course carefully. Location: A cafe shop, decided later before each event Number of participants: 4/5 people once.

co-learning 理论,合伙学习理论

合伙学习是指学生以小组为形式参与,为达到共同的学习目标,在一定的激励机制下最大化个人和他人习得成果,而合作互助的相关行为。

大概有以下好处:

如果你带着教授别人的目的学习,你的学习效果会好几倍

相对于自学,面对面的传授,速度会变快几倍。

已经被证实,合伙学习能 ##极大## 的提高学习的效率和动力和完善知识面。

总之,你还在犹豫什么,加入我们…

微信公众号开发实现点击返回按钮就返回到聊天界面

 pushHistory();

2
3 function pushHistory() {
4 var state = {
5 title: “title”,
6 url: “#”
7 };
8 window.history.pushState(state, “title”, “#”);
9 }
10
11 if (typeof window.addEventListener != “undefined”) {
12 window.addEventListener(“popstate”, function (e) {
13 WeixinJSBridge.call(‘closeWindow’);
14 }, false);
15 } else {
16 window.attachEvent(“popstate”, function (e) {
17 WeixinJSBridge.call(‘closeWindow’);
18 });
19 }

复制代码
1 pushHistory();
2
3 function pushHistory() {
4 var state = {
5 title: “title”,
6 url: “#”
7 };
8 window.history.pushState(state, “title”, “#”);
9 }
10
11 $(function() {
12 wx.config({
13 debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
14 appId: ‘@ViewBag.AppID’, // 必填,公众号的唯一标识
15 timestamp: ‘@ViewBag.TimeStamp’, // 必填,生成签名的时间戳
16 nonceStr: ‘@ViewBag.NonceStr’, // 必填,生成签名的随机串
17 signature: ‘@ViewBag.Signature’, // 必填,签名,见附录1
18 jsApiList: [
19 ‘checkJsApi’,
20 ‘hideOptionMenu’,
21 ‘scanQRCode’,
22 ‘closeWindow’
23 ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
24 });
25
26 wx.ready(function() {
27 wx.hideOptionMenu();
28 });
29
30 if (typeof window.addEventListener != “undefined”) {
31 window.addEventListener(“popstate”, function(e) {
32 wx.closeWindow();
33 }, false);
34 } else {
35 window.attachEvent(“popstate”, function(e) {
36 wx.closeWindow();
37 });
38 }
39 });

一个让人很郁闷的问题 DRF

今天在在处理一个嵌套结构API 的时候遇到一个很无语的问题: 开始我这样写,是因为 username 只有一个

   def get_host(self,obj):

    h = User.objects.filter( username = 'wow')
    result = HostSerializer(h)
    return result.data

注意,他的报错信息:

Got AttributeError when attempting to get a value for field `username` on serializer `HostSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `QuerySet` instance.
Original exception text was: 'QuerySet' object has no attribute 'username'.

强制加上 many = True 就好了!没想到只有一个也需要加上 many

    def get_host(self,obj):

    h = User.objects.filter( username = 'wow')
    result = HostSerializer(h,many=True)
    return result.data

django 查询过滤的问题

这种形式能完成查询一个属性有多个值的情况

User.objects.filter(username__in=['user1','user2'])

同样这个也可以

groups = Group.objects.filter(player=p1).filter(player=p2)

如果你要查询一个更复杂的情况

filter_dict = disc()
把相关值打包放进去

User.objects.filter(**filter_disc)

#我查到另外一个但是不行!

class AppRightManageListView(ListView): template_name = ‘rightmanage/list_apprightmanage.html’ # model = DeployPool paginate_by = 50

def get_queryset(self):
    filter_dict = dict()
    if self.request.GET.get('search_pk'):
        filter_dict['name__contains'] = self.request.GET.get('search_pk')
    if self.request.GET.get('app_name'):
        filter_dict['id'] = self.request.GET.get('app_name')
    if self.request.GET.get('site_name'):
        app_id_list = []
        site = Site.objects.get(id=self.request.GET.get('site_name'))
        for app in site.app_name.all():
            app_id_list.append(app.id)
        filter_dict['id__in'] = app_id_list
    return App.objects.filter(**filter_dict)