Django:外键查询

时间:2010-10-31 11:48:23

标签: django django-models

我正在学习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中的PlaceRef,请随时提出替代方案。

感谢您帮助初学者!

1 个答案:

答案 0 :(得分:12)

首先,我建议将模型重写为:

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