2010-10-31 108 views
3

我在學習Django並試圖通過橋接表來查詢外鍵的問題。如果這是重複的道歉,我一直沒能通過搜索找到答案。我如下Django:外鍵查詢

class Place(models.Model): 
    id = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=100) 
class PlaceRef(models.Model): 
    place = models.ForeignKey(Place) # many-to-one field 
    entry = models.ForeignKey(Entry) # many-to-one field 
class Entry(models.Model): 
    id = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=10) 

如果我想要檢索與特定地點相關聯的所有參賽作品,我怎麼做它得到了定義的模型?

place = get_object_or_404(Place, id=id) 
placerefs = PlaceRef.objects.filter(place=place) 
entries = Entry.objects.filter(id.....) 

此外,如果有對我來說是在Django定義(或擺脫)PlaceRefs更明智的方式,請隨時提出其他建議。

感謝您幫助初學者!

回答

9

首先,我建議重寫車型:

class Place(models.Model): 
    id = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=100) 
class Entry(models.Model): 
    id = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=10) 
    places = models.ManyToManyField(Place, related_name='places') 

所以,你可以查詢:

Entry.objects.filter(places__id=id) 

在當前模型:

Entry.objects.filter(placeref_set__place__id=id) 

注意,雙下劃線__用於從一個模型跳到另一個模型。此外,django在模型上創建了一些幫助您導航到相關對象的字段。在這個例子中:Entry.placeref_set。你可以閱讀更多關於它在這裏:

http://docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward

+2

+1通過改變一個多對多的關係,擺脫PlaceRef的。值得說明的是,幕後仍然存在一個橋接表,但除非您明確定義並在ManyToMany上使用'through'屬性,否則它不會公開。 – 2010-10-31 12:20:00