Django:外键查询

10

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

感谢您帮助初学者!

1个回答

23

首先,我建议重新编写模型:

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

3
将关系改为ManyToMany来摆脱PlaceRef,加1分。值得说明的是,在幕后仍然有一个桥接表,但除非您明确定义它并在ManyToMany上使用“through”属性,否则不会公开显示它。 - Daniel Roseman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接