2010-10-31 111 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