VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • 谈谈 django 应用实践(2)

3. django 表对应关系有一对一(OneToOneField),一对多 (ForeignKey),多对多 (ManyToManyField),其中 多对多的模式通过创建一个中间表来实现。

1
2
3
4
class Book(models.Model):
    place = models.OneToOneField(Place, primary_key=True)
    pub=models.ForeignKey(Publisher)
    authors=models.ManyToManyField(Author)

上面的例子中间表包括 author_id 和 book_id

4. django 的 signal 实现 hook 数据库写行为,比如,pre_save, post_save,pre_delete, post_delete,你也可以自定义 signal, hook 其他行为。

1
2
3
4
@receiver(post_save, sender=TransactionDetail, dispatch_uid="update_stock_count")
def update_stock(sender, instance, **kwargs):
     instance.product.stock -= instance.amount
     instance.product.save()

5. Person.objects.all(), 这里面的 objects 其实是个 manager, 实现了 all, filter 等函数,可以自定义。

1
2
class Person(models.Model):
    object = models.Manager()

6. django 的 queryset 是惰性的,只有在真正用的时候才会去数据库查询,并且查询一次后,会有缓存,当再次遍历这个 queryset 的时候,不会再去查询。

1
person_set = Person.objects.filter(first_name="Dave")

7. 数据库第一次创建后,会有再次更新字段的需求。django 在 1.4 版本前并没有这个功能,得用第三方库 south 来更新,后来的版本 django 自带了 migration 功能,能够将最新的 model 版本和数据库的字段作对比,自动生成 migration 文件

 

1
2
python manage.py makemigrations # 生成 migration 文件
   python manage.py migrate # 将更改应用到数据库

8. orm 不能直接看到 raw sql 语句,可以通过如下语句查看 sql

1
2
from django.db import connection
connection.queries

9. 可以使用 django-debug-toolbar 插件查看慢查询,也能对对哪些页面载入较慢有个大致的了解。

10. 在 orm 中使用 select_related() 减少查询数据库次数:,select_related() 会自动扩展外键关系

1
2
3
4
5
6
class Province(models.Model):
    name = models.CharField(max_length=10)
class City(models.Model):
    name = models.CharField(max_length=5)
    province = models.ForeignKey(Province)
citys = City.objects.select_related().all()

相关教程