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對象的數組


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM