• 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对象的数组
    你没有做到,你保证你确实用心了吗?
  • 相关阅读:
    poj 3068 Bridge Across Islands
    XidianOJ 1086 Flappy v8
    XidianOJ 1036 分配宝藏
    XidianOJ 1090 爬树的V8
    XidianOJ 1088 AK后的V8
    XidianOJ 1062 Black King Bar
    XidianOJ 1091 看Dota视频的V8
    XidianOJ 1098 突击数论前的xry111
    XidianOJ 1019 自然数的秘密
    XidianOJ 1109 Too Naive
  • 原文地址:https://www.cnblogs.com/blogofwyl/p/4273502.html
Copyright © 2020-2023  润新知