實例:
創建表,表都是一對一,一對多
class Province(models.Model): name = models.CharField(max_length=10) class City(models.Model): name = models.CharField(max_length=5) province = models.ForeignKey(Province)#province是字段名 class Person(models.Model): firstname = models.CharField(max_length=10) lastname = models.CharField(max_length=10) visitation = models.ManyToManyField(City, related_name = "visitor") hometown = models.ForeignKey(City, related_name = "birth") living = models.ForeignKey(City, related_name = "citizen")
2.對於一對一字段(OneToOneField)和外鍵字段(ForeignKey),可以使用select_related 來對QuerySet進行優化,在對QuerySet使用select_related()函數后,Django會獲取相應外鍵對應的對象,從而在之后需要的時候不必再查詢數據庫了。
3.select_related() 接受可變長參數,每個參數是需要獲取的外鍵(父表的內容)的字段名,以及外鍵的外鍵的字段名、外鍵的外鍵的外鍵…。若要選擇外鍵的外鍵需要使用兩個下划線“__”來連接。
以上例說明,如果我們需要打印數據庫中的所有市及其所屬省份,使用select_related的做法是:
citys = models.city.objects.select_related('province').all()
for p in citys:
print(p.province)
我們要獲得張三的現居省份,可以用如下方式:(張三的外鍵是city,city的外鍵是province,即外鍵的外鍵,要用雙下划線__)
zhangs = Person.objects.select_related('living__province').get(firstname=u"張",lastname=u"三")
print(zhangs.living.province)