2012-06-20 54 views
1

我GOOGLE上和,我只是似乎沒有得到它。在Django基本關係(建立在傳統的DB之上)

我如何重新在Django簡單的連接查詢?

在models.py(Fylker是縣,Dagensrepresentanter是人)

class Fylker(models.Model): 
    id = models.CharField(max_length=6, primary_key=True) 
    navn = models.CharField(max_length=300) 
    def __unicode__(self): 
     return self.navn 
    class Meta: 
     db_table = u'fylker' 

class Dagensrepresentanter(models.Model): 
    id = models.CharField(max_length=33, primary_key=True) 
    etternavn = models.CharField(max_length=300, blank=True) 
    fornavn = models.CharField(max_length=300, blank=True) 
    fylke = models.ForeignKey(Fylker, db_column='id') 
    def __unicode__(self): 
     return u'%s %s' % (self.fornavn, self.etternavn) 
    class Meta: 
     ordering = ['etternavn'] # sette default ordering 
     db_table = u'dagensrepresentanter' 

由於模型是自動創建的Django的,我已經加入了ForeignKey的,並試圖將它連接到縣。 ID字段是從我試圖集成到這個Django項目的數據庫繼承。

通過查詢

Dagensrepresentanter.objects.all() 

我得到的所有的人,但沒有自己的縣城。 通過查詢

Dagensrepresentanter.objects.all().select_related() 

我得到Dagensrepresentanter.id和Fylker.id聯接,但我想泰德加入到上Fylke的,又名

SELECT * FROM dagensrepresentanter d , fylker f WHERE d.fylke = f.id 

這樣我能得到縣名(Fylke navn)與所有人都有相同的結果集。

附加請求: 我已經閱讀了django文檔和相當多的問題,這裏在stackoverflow,但我似乎無法得到我的頭圍繞這個ORM的東西。這是受到質疑的問題。你有什麼好的資源(相關博客文章與經驗/解釋等)人們習慣認爲的數據庫爲SQL-的事情,需要開始在Django ORM思維?

+0

您是否使用過['./manage.py inspectdb'](https://docs.djangoproject.com/en/dev/ref/django-admin/#inspectdb)? - 它可以幫助你處理遺留數據庫。 – Tadeck

+0

./manage.py inspectdb顯示我的models.py文件的起點。 e.g的'Fylke的= models.ForeignKey(Fylker,db_column = 'ID')從我的當前models.py'表示爲'Fylke的= models.CharField(MAX_LENGTH = 6,空白=真)'。我從中學到了什麼?那Django沒有注意到我改變了models.py?要麼? – Eiriks

+0

@Eriks:你真的想達到什麼目的?你希望你的數據庫能夠遵循模型的變化嗎?使用南。你想要基於你在數據庫中擁有的模型嗎?使用'inspectdb'。你是否想根據模型從頭創建數據庫?定義模型並使用'syncdb'。我不知道問題在哪裏。如果你想學習ORM,有很多教程,ORM只是數據庫頂層的一個抽象層(Object-Relational Mapper是相當具有描述性的名字)。 – Tadeck

回答

0

你的遺留數據庫可能沒有外鍵約束(例如,如果使用的MyISAM然後外鍵甚至不支持)。

你有兩個選擇:

  1. 添加外鍵約束,以你的表(將涉及升級到InnoDB的,如果你在MyISAM數據)。然後再次運行./manage inspectdb,關係應該出現。
  2. 使用表作爲是(即,它們之間沒有明確的關係)和在對象級別或通過編寫自己的SQL查詢手動(例如,Mytable.objects.get(other_table_id = 23))任一組成的查詢。無論哪種方式,你都失去了Python的ORM查詢語言的許多好處。
相關問題