【Python】django模型models的外鍵關聯使用


Python 2.7.10,django 1.8.6

外鍵關聯:http://www.bubuko.com/infodetail-618303.html

字段屬性:http://www.cnblogs.com/lhj588/archive/2012/05/24/2516040.html

過濾條件:http://www.douban.com/note/301166150/

django模型很強大,可以通過外鍵實現:
  1、主表查詢子表
  2、子表查詢主表
  3、主表查詢主表(多對多情況)

下面舉例中表A、B都為models中的class,實際表名應該為“app_小寫的classname”

獲得的結果是字典,多個結果就是字典組成的列表,可以通過.__dict__['字典key']取出結果

上面三種關聯查詢的通用實現方法是:
  A和B有關聯字段,可以直接使用A表關聯字段查詢B表,例如

from appname.models import A, B

B.objects.filter(a=?)

提示:
1、必須使用關聯的字段作為條件,上面例子中a是表A與表B關聯的字段名
2、反過來同樣可以關聯查詢,例如A.objects.filter(b=?)

 

使用對象的子表_set方法
假設A是主表,B是子表,可以使用

from appname.models import A, B

object_a = A.objects.get(子表外鍵對應主表的字段)
object_a.b_set.all(條件)

提示:
1、從主表獲得的對象查詢子表時,方法一定要“小寫子表名+_set”,或者在class中使用related_name定義主表對象查詢子表時使用的方法名稱。
例如子表字段:

class B(models.Model):
    b_column_1 = models.ForeignKey(A, related_name = 'b')

2、主表獲取對象必須要用get方法,但是條件不限制為對應關聯字段
3、不能反向子表查詢主表
4、多對多的關系要區分誰是主表誰是從表,也可以通過數據庫中的表理解,如果多對多生成了中間表,中間表存在兩個外鍵,那么只能通過順序靠前的外鍵查詢靠后的外鍵,不能反過來

 

django自帶的模型例如auth中的user/group/permission可以修改,首先找到django安裝路徑,然后修改django/contrib/auth/models.py,比如新加表字段,然后執行命令同步到數據庫中:

[root@test test1]# python manage.py makemigrations
[root@test test1]# python manage.py migrate

 

in除了__in語法也可以使用extra方法

model_a.objects.extra(where=['id IN (3, 4, 5, 20)'])

 

model支持group by及count/sum/max/mix等方法

from django.db.models import Count, Min, Max, Sum
#等價 select date,sum(data_length) as s from model_table group by date order by date
model_idl.objects.values('date').annotate(s=Sum('data_length')).order_by("-date")

 

使用外檢的表join

參考:https://www.douban.com/note/301166150/

#name字段是外檢關聯字段,type是關聯表的條件字段
相當於 select * from b join a on b.name=a.id  where a.type=2 and b.status=0
model_b.objects.filter(status = 0, name__type__contains = 2)

 

另外models的update方法只能適用於filter獲得的結果,get獲取到的單個對象無法使用

單個對象可以使用:

object.屬性= value

object.save()


免責聲明!

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



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