2010-07-26 49 views
0

我對Django很陌生,在從現有表中抽取一些麻煩。我試圖從多個連接表中的列中提取數據。我找到了解決方案,但感覺有點像作弊,想知道我的方法是否被認爲是正確的。從Django中的多個表中提取數據

class Sig(models.Model): 
     sig_id = models.IntegerField(primary_key=True) 
     parent = models.ForeignKey('self') 
     state = models.CharField(max_length=2, db_column='state') 
     release_id = models.SmallIntegerField(choices=releaseChoices) 
     name = models.CharField(max_length=255) 
     address = models.CharField(max_length=255, blank=True) 
     city = models.CharField(max_length=255, blank=True) 
     zip = models.CharField(max_length=10, blank=True) 
     phone1 = models.CharField(max_length=255, blank=True) 
     fax = models.CharField(max_length=255, blank=True) 
     email = models.EmailField(max_length=255, blank=True) 
     url = models.URLField(max_length=255, blank=True) 
     description = models.TextField(blank=True) 
     contactname = models.CharField(max_length=255, blank=True) 
     phone2 = models.CharField(max_length=255, blank=True) 
     ratinggroup = models.BooleanField() 
     state_id = models.ForeignKey(State, db_column='state_id') 
     usesigrating = models.BooleanField() 
     major = models.BooleanField() 
     class Meta: 
      db_table = u'sig' 

    class SigCategory(models.Model): 
     sig_category_id = models.IntegerField(primary_key=True) 
     sig = models.ForeignKey(Sig, related_name='sigcategory') 
     category = models.ForeignKey(Category) 
     class Meta: 
      db_table = u'sig_category' 

    class Category(models.Model): 
     category_id = models.SmallIntegerField(primary_key=True) 
     name = models.CharField(max_length=255) 
     release_id = models.SmallIntegerField() 
     class Meta: 
      db_table = u'category' 

然後,這是我的解決方案,它的工作原理,但並不完全感覺不對:

sigs = Sig.objects.only('sig_id', 'name').extra(
      select = { 
       'category': 'category.name', 
      }, 
     ).filter(
      sigcategory__category__category_id = categoryId, 
      state_id = stateId 
     ).order_by('sigcategory__category__name', 'name') 

現在,因爲在過濾器中的項目()加入sigcategory和分類模型,我能通過使用extra()將category.name拉出來。這是做這件事的正確方法嗎?如果我在filter()中沒有引用並且沒有發生連接,該怎麼辦?

回答

2

SigCategory有一個ForeignKey指向類別,讓您可以隨時的SigCategory到類別獲得簡單地做mysigcategory.category(其中mysigcategory是你SigCategory的實例。

如果您還沒有以前訪問的如果你關心數據庫效率,看看select_related

+0

然而,如果我嘗試跳過這樣的關係:sigs [0]。 sigcategory.category,我只是以這個異常結束:'RelatedManager'對象ha s沒有屬性'category' – 2010-07-26 15:49:29

+0

這是因爲可以有許多sigcategories。這不是一個實例,而是一個經理。改爲使用'sigs [0] .sigcategory.all()[0] .category'。 – Wolph 2010-07-26 16:01:51

+1

我簡直不敢相信我逃脫了。多謝你們。 – 2010-07-26 16:04:31