Django - 从外键获取数据

时间:2017-04-03 14:29:07

标签: python django

我正在研究一个Django项目并试图为我的数据创建一些链接模型,这些模型在思考中有效,但我似乎无法弄清楚如何访问链接数据。

class One(models.Model)
  name = models.CharField(max_length=50)
  list = models.ArrayField(models.CharField(max_length=50), blank=True)

  def __str__(self): 
    return self.name

class Many(models.Model)
  name = models.CharField(max_length=50)

  related = models.ForeignKey(One, null=True, blank=True)

  def __str__(self): 
    return self.name    

这是我建立的一般关系。

我想要做的是,在一个模板中可以访问所有'Ones'的列表,并通过每个',可以访问每个Many和它的相关属性。我可以看到如何访问单个“One”的属性,但不知道如何传递所有这些属性及其相关的“Many”模型以及每个模型的相关属性。基本上我想要的输出会有一个One的下拉列表,当提交时,一些Javascript将使用'Many'模型中的列表来做一些事情。

非常感谢任何建议。

3 个答案:

答案 0 :(得分:1)

可以通过对象的___set attribte访问反向查找。因此,要获得给定“One”的所有“Many”对象,您可以执行one.many_set

Django reverse lookup of foreign keys

关于模板中的用法,可以通过添加“all”来访问集合(因为集合返回一个查询集,您可以针对它运行查询,包括在模板中)

Access ForeignKey set directly in template in Django

请参阅Django文档的相关部分:https://docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward

答案 1 :(得分:1)

您可以使用Django的“prefetch_related”和Django的“related_name”。

此外,这个问题已经回答here

虽然,您可能需要这样,但首先,将您的外键定义更改为:

related = models.ForeignKey(One, null=True, blank=True, related_name='relateds')

然后你可以反向获取外键:

one = One.objects.get(name="TheOneYouWant").prefetch_related('relateds')
manys = one.relateds

答案 2 :(得分:1)

如果您已拥有One模型类的对象,则可以使用many访问many_set个对象(请参阅:backward relations):

{% for one_obj in one_objs %}
    {% for m_obj in one_obj.many_set.all %}
        # do stuff with m_obj here
    {% endfor %}
{% endfor %}

这里要注意的一件重要事情是,这将为每个m_obj执行数据库查询。为了提高效率,您可以在视图中使用many_set预取one_objs

在您看来,使用prefetch_related

one_objs = One.objects.all().prefetch_related('many_set')