django中外键关联表的查询随笔

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对象的数组

时间: 2024-10-27 16:27:34

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

django多对多关联表的操作

1.发生背景:在django项目中需要一个项目管理和一个资产管理.就牵涉到多对多的关系,如下: class AssetGroup(models.Model):    GROUP_TYPE = (        ('P','PRIVATE'),        ('A','ASSET')    )    name = models.CharField(max_length=80,unique=True)    comment = models.CharField(max_length=300,bla

关于mysql中外键关联的一些个人理解

在我看来hibernate最麻烦的一件事就是配置外键关联,稍微不慎就会出现配置错误的情况,现在的项目全部都是在使用mybaits,而mybaits使用就简单的多,起码虽然说是要自己写mysql语句,但是起码这种做法在现阶段的项目开发中还是非常的流行,以前经常听到眼言论说用hibernate开发会比mybaits要来得快,其实那应该 是对于高手而言,但是绝大部分如我这群菜逼而言,老老实实的写sql语句会更好一点,废话不多说,今天主要是谈谈外键关联对在项目开发中的影响. 表的关联,在某种程度上来说只

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

--从左到右分别是: 外键约束名,子表名,外键列名,父表名 --use demodtcms--外键信息select fk.name fkname , ftable.name ftablename, cn.name fkcol, rtable.name ftablename,ObjectProperty(fk.id,'CnstIsUpdateCascade') updatCase,ObjectProperty(fk.id,'CnstIsDeleteCascade') deletCase from

portal开发怎么配置一个新增按钮,同时在“新增按钮”中配置关联表的查询(四)

我在配置这个东西的时候主要的问题是卡在哪里呢? 就看到看懂那个.wd文件 1 <Models> 2 <Datasets> 3 <RefMdDataset caption="HR部门" controlwidgetopeStatus="false" enabled="false" id="$refds_hrjf_hrdept" lazyLoad="true" notNullBody

mybatis实战教程(mybatis in action)之四:实现关联数据的查询

有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如最常见到的多对一,一对多等.这些查询是如何处理的呢,这一讲就讲这个问题.我们首先创建一个Article 这个表,并初始化数据. Drop TABLE IF EXISTS `article`; Create TABLE `article` ( `id` int(11) NOT NULL auto_increment, `userid` int(11) NOT NULL, `title` varchar(100

多表联合查询后去重复数据后重新插入第一张表解决办法

select goods_id,goods_type,goods_name,in_buy_price,ROUND(sum(in_total_price)/sum(in_amount),2),count(*) from in_warehouse_detail group by goods_id,goods_type,goods_name order by goods_id,goods_type,goods_name 查询结果如下: 另一张关联表[通过goods表的goods_Id和in_wareh

Django -- 一对多建表增删改查

一对多表结构 ForeignKey -- 设置外键与另一张表关联 class Book(models.Model): title = models.CharField(max_length=32) pub = models.ForeignKey('Publisher', on_delete=models.CASCADE) # 外键 -- 关联表另一张表 查询 all_books = models.Book.objects.all() # 获取所有的数据 print(all_books) for

mybatis实战教程(mybatis in action)之四:实现关联数据的查询

有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如最常见到的多对一,一对多等.这些查询是如何处理的呢,这一讲就讲这个问题.我们首先创建一个Article 这个表,并初始化数据.  程序代码 Drop TABLE IF EXISTS `article`;Create TABLE `article` (  `id` int(11) NOT NULL auto_increment,  `userid` int(11) NOT NULL,  `title` var

Mybatis学习(4)实现关联数据的查询

有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如最常见到的多对一,一对多等.这些查询是如何处理的呢,这一讲就讲这个问题.我们首先创建一个Article 这个表,并初始化数据.  程序代码 Drop TABLE IF EXISTS `article`; Create TABLE `article` ( `id` int(11) NOT NULL auto_increment, `userid` int(11) NOT NULL, `title` varch