1. 程式人生 > >django中外來鍵關聯表的查詢隨筆

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物件的陣列

相關推薦

django外來關聯查詢隨筆

django中,如果一個數據庫中的表之間有外來鍵的話可以方便的通過一個表查詢到其相關表的資料。如有下面三個model:class Blog(models.Model):    name = models.CharField(max_length=100)    tagline = models.TextFie

Django外來使用詳解

在寫專案的過程中我們不可避免的會使用到外來鍵這個東西,那麼Django中是怎樣來使用外來鍵的呢? 瞭解外來鍵 在MySQL中,表有兩種引擎,一種是InnoDB,另外一種是myisam。如果使用的是InnoDB引擎,是支援外來鍵約束的。外來鍵的存在使得ORM框架在處理表關係的時候異常的

Flask-SQLAlchemy - 不使用外來查詢。記得常回來看我

前言         相比於 Django 的 ORM ,SQLAlchemy "不依靠外來鍵進行跨表聯查" 的解決方案就比較多。         沒啥好說的,只能怪自己學藝不精..  _(:з」∠)_&n

mongodb多查詢外來關聯,命令+java方式實現

首先,我們回憶一下,MySQL多表關聯查詢的語句: student表: CALSS表: 通過student的classId關聯進行查詢學生名稱,班級的資料: SELECT student.name,student.age,class.name FROM stud

django admin編輯被外來關聯的主表時支援顯示字記錄

假設有模型 class A(models.Model): name = models.CharField() class B(models.Model): name = models.CharField() a = models.ForeignK

DjangoORM外來的關係(Django程式設計-4)

外來鍵 在MySQL中,表有兩種引擎,一種是InnoDB,另外一種是myisam。如果使用的是InnoDB引擎,是支援外來鍵約束的。外來鍵的存在使得ORM框架在處理表關係的時候異常的強大。因此這裡我們首先來介紹下外來鍵在Django中的使用。 類定義為class ForeignKey(to,on_delete

mysql清空有外來關聯

第一種:(不要外來鍵約束) 手動刪除外來鍵約束; 刪除表資料   第二種:(保留外來鍵約束) SET FOREIGN_KEY_CHECKS = 0;   TRUNCATE TABLE 表名;  SET FOREIGN_KEY_CHECKS = 1; 

oracle 禁用所有外來關聯

禁用外來鍵 select 'alter table '|| t.table_name||' disable constraint '||t.constraint_name||';' from user_constraints t where t.constraint_type =

EF的主外來查詢 基於EF的資料外來關聯查詢

今天在學習EF主外來鍵查詢時,在園子裡找到了一篇基於EF的資料外來鍵關聯查詢的文章,看完後覺得可以試試, 然後就在我的demo中敲了原文章中的"GetItem"方法。如下: 1 public T Find<T>(Expression<Func<T, bool>&g

查詢外來之間的關係

外來鍵 通常在實際工作中,資料庫中表格都不是獨立存在的,且表與表之間是有種聯絡的,比如兩張表格,一張為分類表category,一張為商品表product。在分類表中有兩個資訊,cid、cname,商品表中有三個資料資訊pid、name、price。兩張表要想有著某種聯絡

djangoform從後端查詢回顯到前端以及單的提交到伺服器操作

這個表格是我以下程式碼出現的效果,以下程式碼也可以實現圖中修改儲存刪除操作。 1:首先你得建立一張表,在這裡建表語句我就不再寫了,再也簡單不過了。(別忘了加點資料哦!) 2:將表的資料通過view.py的函式返回到前端。在這裡stu是表名,將所有的返回結果all通過一

資料庫外來的建立

** Can’t create table ‘.\xyrensheju#sql-710_6.frm’ (errno: 150) ** 我建立外來鍵時,得到了這個錯誤,我對錶和欄位檢查了又檢查,始終沒有發現問題出現在哪裡,百度了很多下,終於找到了解決的辦法,是我的主表的複合主鍵索引沒

Mysql清空帶有外來關聯關係資料

Mysql  清空資料庫表資料 truncate table wp_comments; delete * from wp_comments; delete from static.wp_comments;  MySql 清空帶有外來鍵的表資料 SET

django專案培訓站-30-外來關聯正向與反向取值

模型類新增欄位時,要設為空 null = True, blank = True 表關聯的注意 課程表取課程機構表,在檢視中 c = course.objects.get('name'='abc','') corg=c.course_org 如果是課程機構表取課程內容

Hibernate外來使用(個人筆記)

(由於這篇文章寫得雜亂無章,隨便參考即可,不建議照做,僅作為本人日常記錄) 1.前端部分 我們的思路是這樣的:做一個登入頁面(login.jsp),登入之後點選“朋友資訊”(已登入頁面main.jsp),就可以進入朋友資訊頁面進行資料修改(friend

MySQL練習-主外查詢

名稱 having用法 mysq bold 約束 mysql auto update caption 練習: 1.建立表關系: 請創建如下表,並創建相關約束 1 USE db1; 2 CREATE TABLE class( 3 cid INT AUT

MyBatis學習總結——實現關聯查詢(轉)

得到 into primary 字符串 student prim oci ssr ret 原文鏈接:孤傲蒼狼 一、一對一關聯 1.1、提出需求   根據班級id查詢班級信息(帶老師的信息) 1.2、創建表和數據   創建一張教師表和班級表,這裏我們假設一個老師只負責教一個

case關聯查詢

lar null from then 員工 AS 聯表查詢 case 關聯表 select a.員工編號,b.`姓名`,b.`地址`,case when a.收入 is null then ‘沒錢‘ when a.收入 < 2000 then ‘低收入‘when a

EF Core外來關係的DeleteBehavior介紹(轉自MSDN)

Delete behaviors Delete behaviors are defined in the DeleteBehavior enumerator type and can be passed to the OnDelete fluent API to control whether the de

MySQL:使用SQL語句清空所有外來關聯

 解決辦法 查詢資料庫中所有外來鍵名稱然後拼接生成刪除語句,再複製執行 SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DROP FOREIGN KEY ',CONSTRAINT_NAME,' ;') FROM