zoukankan      html  css  js  c++  java
  • 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对象的数组
    你没有做到,你保证你确实用心了吗?
  • 相关阅读:
    XML参考 :XmlReader 详解、实例(2) 读取XML节点
    JavaScript: Cookie 详解、实例与应用
    什么是Cookie?Cookie有什么作用?
    JavaScript: indexOf 详解、实例与应用
    XML参考 :XmlReader 详解、实例(3) 读取XML节点和属性名称
    XML参考 :XmlReader 详解、实例(1) 详解
    C# 参考:泛型(1) 泛型简介与泛型问题陈述
    Visual Studio 2003/Visual Studio 2005常用快捷键
    XML参考 :XmlReader 详解、实例(4) 读取XML内容
    Page.trace 跟踪调试 详解
  • 原文地址:https://www.cnblogs.com/blogofwyl/p/4273502.html
Copyright © 2011-2022 走看看