about-python-0

python应用的方方面面-0-Django

model 的继承

  • 抽象继承
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Animal(models.Model):
name = models.CharField(max_length=50)
age = models.PositiveIntegerField()

# 下面这句决定了Animal是一个抽象类/Model
class Meta:
abstract = True

class Human(Animal):
kind_hearted = models.BooleanField()
sex = models.CharField('sex', choices=(('m','male'), ('f', 'female')), max_length=1)
#...

```
****

+ 正常继承

和抽象继承的主要区别是父类这时也可以拥有数据库表了,并且不在身为存储公共信息的抽象类了,父类也可以进行实例化,查询等操作了。

class Country(models.Model):
name = models.CharField(max_length=10)

#...

class Province(Country):
return = models.BooleanField()

#...
1
2
3
4
5
6

****

+ 代理

在子类中只能增加方法,而不能增加属性,在不影响父类数据存储的前提下,使子类继承父类,此时子类称为父类的“代理”。

from django.contrib.auth.models import User

class Person(User):

# this makes a class proxy
proxy = True

def can_dance(self):
    return True

both Yellow and Black can_dance :)

class Yellow(Person):
hometown = models.CharField(max_length=30)

class Black(Person)
tribe_name = models.CharField(max_length=100)

1
2
3
4
5
6
7
8
9
10

****

## django Q 对象

在进行相对复杂的查询时,使用django.db.models.Q对象

```sql

SELECT * FROM order WHERE id BETWEEN 20 ADN 100 AND(num <= '20' or num >= '30');

可以改写为

1
2
3
4
5
6
7
from django.db.models import Q
from login.models import Order
#...
Order.objects.get(
Q(id >= 20) & (id <= 100),
Q(num <= 20) | (num >= 30)
)

验证表单提交格式是否正确 使用哪个函数?

is_valid()    # 函数方法,用于检查表单提交是否正确

取消级连删除

user = models.ForeignKey(User, blank=True, null=True, on_delete=models.SET_NULL)

并且SET_NULL只有在null为True的时候,才可以使用

django 在 model 保存前做一定的固定操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

import logging
from django.db import models
from django.db.models.signals import pre_save
from django.dispatch import receiver

class Order(models.Model):
# ...

logger = logging.getLogger(__name__)

@receiver(pre_save, sender=Order)
def pre_save_handler(sender, **kwargs):

# 我们可以在Order这个Model保存之前尽情调戏了:)
logger.debug("{},{}".format(sender, **kwargs))
print 'fuck universe'

django session

说到session的运行机制,就一定要先说一下cookie这一段信息。一般情况下cookies都是我们的浏览器生成的(显然可以人为修改),用于服务器对户进行筛选和维护,但是这个听上去很好吃的东西,能存的东西有点少而且容易被别人利用。这时候基于cookies的session的意义就比较明显了,在客户端的cookies中我们只保存session id,而将完整信息以加密信息的形式保存到服务器端,这样服务器可以根据session id相对安全的在数据库中查询用户的更细致的信息和状态。
在Django中session和cookies的操作方法一样,如下:

1
2
3
4
5
6
7

# 保存session
request.session['order_id'] = order_id
# 删除session
del request.session['order_id']
# 读取session
session.get('order_id', False)