Django 数据模型进阶

访问外键(ForeignKey)值:

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

<span style="font-size:18px;"><span style="font-size:18px;">models.py
from django.db import models

class Publisher(models.Model):
     name = models.CharField(max_length=50)
     website = models.CharField(max_length=60)

      def __unicode__(self):
            return self.name

class Author(models.Model):
       name = models.CharField(max_length=50)
       email = models.EmailField()

       def __uniclde__(self):
             return self.name

class 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.py
from django.db import models

class Publisher(models.Model):
     name = models.CharField(max_length=50)
     website = models.CharField(max_length=60)

      def __unicode__(self):
            return self.name

class Author(models.Model):
       name = models.CharField(max_length=50)
       email = models.EmailField()

       def __uniclde__(self):
             return self.name

class 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 connection

cursor = connection.cursor()
cursor.execute('select * from app_book')
cursor.fetchall()



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值