Django 数据模型进阶

来源:互联网 发布:王师傅知乎 编辑:程序博客网 时间:2024/06/08 18:59

访问外键(ForeignKey)值:

当你访问一个外键属性时,获取的是一个数据模型对象

<span style="font-size:18px;"><span style="font-size:18px;">models.pyfrom django.db import modelsclass Publisher(models.Model):     name = models.CharField(max_length=50)     website = models.CharField(max_length=60)      def __unicode__(self):            return self.nameclass Author(models.Model):       name = models.CharField(max_length=50)       email = models.EmailField()       def __uniclde__(self):             return self.nameclass Book(models.Model):       title = models.CharField(max_length=50)       publisher = models.ForeignKey(Publisher)       author = models.ManyToManyField(Author)       pub_date = models.DateTimeField()>>> from models import *>>>b = Book.objects.get(pk=3)>>>b.publisher>>>b.publisher.name </span></span>
foreignkey关系也可以反推过来:

<span style="font-size:18px;"><span style="font-size:18px;">>>>p = Publisher.objects.get(pk=2)>>>p.book_set.filter(title__icontains= 'python')[<Book: python>  <Book: python web>, <Book: python cookbook>]</span></span>

book_set实际上是一个queryset,因此它可以进行filter操作。book_set属性是由模型名的小写形式加上_set组成


访问ManyToManyField

我们处理的是一个queryset而不是一个数据模型

<span style="font-size:18px;"><span style="font-size:18px;">>>>b = Book.objects.get(pk=1)<Book: python>>>>b.author.all()[<Author:joe>, <Author:jam>, <Author:Sam>]>>>b.author.filter(name__icontains='am')[<Author:jam>, <Author:Sam>]</span></span>
也可以通过book_set来查询一个作者的所有书籍
<span style="font-size:18px;"><span style="font-size:18px;">>>>a = Auhtor.objects.get(name='Sam')>>>a.book_set.all()</span></span>

Manager

     模块manager是一个对象,Django通过它进行数据库查询。每个Django模块至少有一个manager,你可以自定义manager。增加manager额外的方法或者修改manager返回的初始的queryset

增加额外的方法

<span style="font-size:18px;"><span style="font-size:18px;">models.pyfrom django.db import modelsclass Publisher(models.Model):     name = models.CharField(max_length=50)     website = models.CharField(max_length=60)      def __unicode__(self):            return self.nameclass Author(models.Model):       name = models.CharField(max_length=50)       email = models.EmailField()       def __uniclde__(self):             return self.nameclass BookManager(models.Manager):        def title_count(self, keyword):             return self.filter(title=keyword).count()class Book(models.Model):       title = models.CharField(max_length=50)       publisher = models.ForeignKey(Publisher)       author = models.ManyToManyField(Author)       pub_date = models.DateTimeField()               objects = BookManager()</span></span>
修改初始manager queryset

        通过覆盖Manager的get_query_set()方法来修改初始的queryset

<span style="font-size:18px;">class BookManager(models.Manager):        def get_query_set(self):             return super(BookManager, self).get_query_set().filter(title__icontains='python')<pre name="code" class="python"><span style="font-size:18px;">class Book(models.Model):       title = models.CharField(max_length=50)       publisher = models.ForeignKey(Publisher)       author = models.ManyToManyField(Author)       pub_date = models.DateTimeField()               objects = models.Manager()       classify_objects = BookManager()>>>Book.objects.all()     #获取所有书籍>>>Book.classify_objects.all()                #获取所有title中包含python的书</span>  </span>

当有多个Manager时,Django默认使用第一个manager。

执行原始SQL查询

from django.db import connectioncursor = connection.cursor()cursor.execute('select * from app_book')cursor.fetchall()



0 0
原创粉丝点击