基于 Django1.10 文档的深入学习(5)—— Making queries 之 FOO_set

进行查询Making queries

创建数据模型后,Django会自动为您提供一个数据库抽象API,您可以创建,检索,更新和删除对象。本文档介绍如何使用此API。有关所有各种型号查找选项的详细信息,请参阅数据模型参考。

在本指南(和参考文献)中,我们将参考以下包含Weblog应用程序的模型:

from django.db import models

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def __str__(self):              # __unicode__ on Python 2
        return self.name

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

    def __str__(self):              # __unicode__ on Python 2
        return self.name

class Entry(models.Model):
    blog = models.ForeignKey(Blog)
    headline = models.CharField(max_length=255)
    body_text = models.TextField()
    pub_date = models.DateField()
    mod_date = models.DateField()
    authors = models.ManyToManyField(Author)
    n_comments = models.IntegerField()
    n_pingbacks = models.IntegerField()
    rating = models.IntegerField()

    def __str__(self):              # __unicode__ on Python 2
        return self.headline

相关对象Related objects

当您在模型中定义关系(即ForeignKeyOneToOneFieldManyToManyField)时,该模型的实例将具有方便的API来访问相关对象。

使用此页面顶部的模型,例如,Entry对象e可以通过访问博客属性e.blog获取其关联的博客对象。

Django还为关系的“其他”一方创建了API访问器 - 从相关模型到定义关系的模型的链接。例如,博客对象b可以通过entry_set属性访问所有相关的Entry对象的列表:b.entry_set.all()

本节中的所有示例都使用本页顶部定义的博客,作者和条目模型。

关系“后退”

如果模型具有ForeignKey,则外键模型的实例将可以访问返回第一个模型的所有实例的Manager。 默认情况下,此管理器名为FOO_set,其中FOO是源模型名称,小写的。 此管理器返回QuerySets,可以按照上述“检索对象”部分中所述进行过滤和操作。

例:

>>> b = Blog.objects.get(id=1)
>>> b.entry_set.all() # Returns all Entry objects related to Blog.

# b.entry_set is a Manager that returns QuerySets.
>>> b.entry_set.filter(headline__contains='Lennon')
>>> b.entry_set.count()

您可以通过在ForeignKey定义中设置related_name参数来覆盖FOO_set名称。 例如,如果将Entry模型更改为blog = ForeignKey(Blog,on_delete = models.CASCADE,related_name ='entries'),则上述示例代码将如下所示:

>>> b = Blog.objects.get(id=1)
>>> b.entries.all() # Returns all Entry objects related to Blog.

# b.entries is a Manager that returns QuerySets.
>>> b.entries.filter(headline__contains='Lennon')
>>> b.entries.count()

# 课程信息表
class Course(models.Model):   
    name = models.CharField(max_length=50, verbose_name='课程名称')
    desc = models.CharField(max_length=300, verbose_name='课程描述')
    detail = models.TextField(verbose_name='课程详情')

# 课程章节表
class Lesson(models.Model):
    course = models.ForeignKey(Course, verbose_name='课程')
    name = models.CharField(max_length=100, verbose_name='章节名')
    add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值