django中,如果一个数据库中的表之间有外键的话可以方便的通过一个表查询到其相关表的数据。如有下面三个model:
class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

def __unicode__(self):
        return self.name

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

def __unicode__(self):
        return self.name

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

def __unicode__(self):
        return self.headline

可以使用__来查询相关连的表里的数据,如:
Entry.objects.filter(blog__name__exact='Beatles Blog')
Blog.objects.filter(entry__headline__contains='Lennon')
甚至可以查询关联表的关联表里的数据Entry.objects.filter(blog__name__exact='Beatles Blog')

django中可以通过外键类对象得到主键类的对象,因为一个外键类的对象只能得到一个键类的对象,所以这个方法是可行的。如:e是一个Entry对象,则e.blog为e所对应的blog对象。即,e的blog属性就是一个blog类对象。

django还有一种通过对象访问相关联表数据的方法,即用_set。但是这种方法只能是相关类访问定义了关系的类(主键类访问外键类)。如:b.entry_set.all()    #b是一个blog对象

另外还有就是如果Entry中blog属性的定义如果改成这样:blog = ForeignKey(Blog, related_name='entries')这样的话就可以像下面这样通过blog对象得到entry对象的一个集合:

>>> 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()

django 的model里面__还有一个方便的用法,如:Entry.objects.get(headline__exact="Man bites dog")。其中headline是一个属性名,exact是一个lookup type,它规定了字段查询的一些规则,如部分匹配(like),忽略大小写等等。更多的lookup type见:http://docs.djangoproject.com/en/dev/topics/db/queries/#topics-db- queries。

 
如果有两个一个model中有两个外键同时对应于同一个model,那么要指定related_name,这个名字是主键model来调用外键model是代表“外键model名_set”的。如:
from django.db import models
from django.contrib.auth.models import User
 
class Relation(models.Model):
    follower = models.ForeignKey(User, related_name='follower')
    followed = models.ForeignKey(User, related_name='followed')
 
reobjs = followed.followed.filter(follower = follower)
#reobjs是一个装着Relation对象的数组

django中外键关联表的查询随笔的更多相关文章

  1. SQLServer:查询所有外键关联表信息

     --从左到右分别是: 外键约束名,子表名,外键列名,父表名 --use demodtcms--外键信息select fk.name fkname , ftable.name ftablename, ...

  2. django中外键的related_name属性

    我先定义两个模型,一个是作者,一个是作者出版的书籍,算是一对多的类型. class Person(models.Model); name = models.CharField(verbose_name ...

  3. T-SQL中找出一个表的所有外键关联表

    二种方法(下例中表名为T_Work) 1.SQL查询系统表 SELECT 主键列ID=b.rkey ,主键列名=(SELECT name FROM syscolumns WHERE colid=b.r ...

  4. .net EF Join 关联表分页查询

    Join中第二个参数和第三个参数即为两张表关联对应的字段 第四个参数new 后面如果不写Model名,系统会自动生成带字段的list类型 IQueryable<Operator> oper ...

  5. ACTION 关联表之间查询语句 SQL语句写法

    /** EquUseRecord * @author cll * @return * @右边菜单中的使用记录操作 */ public String QueryAllEquUserecordAllInf ...

  6. orm 语法 数据库连接、建表、增删改查、回滚、单键关联 、多键关联、三表关联

    1.数据库连接, #!usr/bin/env/python # -*- coding:utf-8 -*- # from wangteng import sqlalchemy from sqlalche ...

  7. mysql外键与表查询

    目录 自增特性 外键 外键关系 外键创建 外键的约束效果 级联更新级联删除 多对多关系 一对一关系 表查询关键字 select与from where筛选 group by分组 练习 关系练习 查询练习 ...

  8. AppBox升级进行时 - 关联表查询与更新(Entity Framework)

    AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. 关联表的查询操作 使用 Include 方法,我们可以在一次数据库查询中将关联 ...

  9. 基于EF的数据外键关联查询

    现在很多ORM不自带外键关联的实体查询,比如我查询用户,用时将关联的角色信息查询出来,那么就要进行2次查询,很麻烦.而我现在要做的就是基于EF的外键关联查询.很方便的. 首先,创建基础查询的BaseS ...

随机推荐

  1. PageView

        auto pageview = PageView::create();     pageview->setContentSize(Size(480.0f, 320.0f));     p ...

  2. JDBC入门try/catch型

    package com.itheima.domain; import java.sql.Connection; import java.sql.DriverManager; import java.s ...

  3. JAXB - XML Schema Types, Date and Time

    JAXB binds all three of the schema types xsd:date, xsd:time and xsd:dateTime to XMLGregorianCalendar ...

  4. h2database源码浅析:集群

    Clustering / High Availability This database supports a simple clustering / high availability mechan ...

  5. Extjs3笔记 fbar

    在项目中会遇到在grid右下角显示合计之类的显示. 之前使用过的方式: 1.用width强制顶过去. 2.利用css来控制. 弊端: 利用第一种方式:导致调整窗口大小时会导致合计不能根据窗体的大小变化 ...

  6. linux时间自动同步

    1,修正本地时区及ntp服务 #yum -y install ntp#rm -rf /etc/localtime#ln -s /usr/share/zoneinfo/Asia/Shanghai /et ...

  7. MySql数据库的导入_命令工具

    一.如何导入别人已经建好的数据库 create database goods use goods source E:\goods.sql (绝对路径) 这样就导入了指定的数据库到本机电脑 二.任何数据 ...

  8. asp.net 邮件发送类

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  9. JavaScript 学习笔记: 扩充类型的功能

    JavaScript 是允许给基本类型扩充功能的.例如,可以通过对Object.prototype增加方法,可以让该方法对所有的对象都可用. 这样的方式对函数,数组,字符串,数字,正则表达式和布尔值同 ...

  10. jQuery 源码分析4: jQuery.extend

    jQuery.extend是jQuery最重要的方法之一,下面看看jQuery是怎样实现扩展操作的 // 如果传入一个对象,这个对象的属性会被添加到jQuery对象中 // 如果传入两个或多个对象,所 ...