1. 程式人生 > 程式設計 >django有外來鍵關係的兩張表如何相互查詢

django有外來鍵關係的兩張表如何相互查詢

這篇文章主要介紹了django有外來鍵關係的兩張表如何相互查詢,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

兩張通過外來鍵聯絡的表,如何在一張表上根據另一張表上的屬性查詢滿足條件的物件集?

平常查詢表中資料的條件是python中已有的資料型別,通過名字可以直接查詢。如果條件是表中外來鍵列所對應表的某一列,該如何查詢資料?

表1是新聞表,是回覆表中某一外來鍵指向的表,表2是回覆表。

問題1:根據表1的某些條件來查詢表2的物件集。

class News(models.Model):
 title = models.CharField(max_length=50);
 summary = models.TextField();
 
 url = models.CharField(max_length=150);
 favorCount = models.IntegerField(default=0);
 favorUsername = models.TextField(default="");
 replyCount = models.IntegerField(default=0);

class Reply(models.Model):
 content = models.TextField();
 user = models.ForeignKey('User');
 newID = models.ForeignKey('News');
 replyTime = models.DateTimeField(auto_now_add=True);
 
 def __unicode__(self):
  return self.content;

像這樣的資料表,想要查詢對於新聞id是3的所有回覆?

方法一、首先獲得外來鍵指向的表中物件,然後通過‘_set'這樣的方法獲得目標表中的資料。

obj = models.News.objects.get(id=3)
replys = obj.reply_set.all()

方法二、直接在目標表中通過雙下劃線來指定外來鍵對應表中的域來查詢符合條件的物件。

models.Reply.objects.filter(newID__id=3)

問題2: 根據表2的某些條件查詢表1的物件集。此時需要將表2的名字小寫加兩個下劃線,再加上查詢條件。比如:查找回復內容中包含“new”的所有新聞

models.News.objects.filter(reply__content__contains='new');

在filter中可以這樣用,在values方法中也可以這樣使用,此時的值便是外來鍵對應表中的資料。

2.在使用django中避免不了要跟前臺進行資料互動,而python中的資料型別豐富,比如datetime模組的datetime型別就不可以json編碼,如果想要繼續json格式化,有兩種方法可以解決,

1)使用django提供的格式化

2)自己編寫編碼器或預設處理函式。

注意:pyhton中json只會編碼python中自己的資料型別,比如數字、字串、元組、列表、字典等。在django中處理資料經常遇到queryset這類資料,需要先將他轉化成列表再json編碼。[list(queryset)]

方法一、所以需要更強勁的django.core提供的serializers.serialize方法,一般使用json格式就是serializers.serialize('json',data)。可以很方便的將django中所有資料型別進行json格式編碼。

方法二、自己編寫編碼器或者寫預設處理函式

1)寫自己的編碼器類

class MyJSONEncoder(json.JSONEncoder):
 def default(self,obj):
  if isinstance(obj,datetime.datetime):
   return (datetime.timedelta(hours=8)+obj).strftime('%Y-%m-%d %H:%M:%S');
  elif isinstance(obj,datetime.date):
   return obj.strftime("%Y-%m-%d")
  else:
   return json.JSONEncoder.default(self,obj)

2)寫自己的預設處理函式

def myDumps(obj):
 if isinstance(obj,datetime.datetime):
  return (datetime.timedelta(hours=8)+obj).strftime('%Y-%m-%d %H:%M:%S');
 else:
  return json.dumps(obj);

對其進行測試

t = datetime.datetime.utcnow();
 a=[1,2,43,56]; 
 print json.dumps(t,default=myDumps);
 print json.dumps(a,default=myDumps);
 a.extend([t,t+datetime.timedelta(hours=8)]);
 print json.dumps(t,cls=MyJSONEncoder);

測試結果

"2016-06-26 09:53:03"
[1,56]
"2016-06-26 09:53:03"
[1,56,"2016-06-26 09:53:03","2016-06-26 17:53:03"]

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。