Django外键关系

时间:2016-04-08 11:48:45

标签: python mysql django database foreign-key-relationship

我最近开始使用Python和Django制作网站,我遇到了一个我无法弄清楚的问题。

你可以肯定的是,这是因为我完全缺乏经验,而且我忽视了一些简单的事情或者做了一些愚蠢的事情,但是哦,好吧......

在我的网站上,我有一个页面显示有关食谱的详细信息(描述,成分,说明等)。我这样显示:

views.py
class RecipeView(generic.DetailView):
    model = recipe
    template_name = 'whatsfordinner/recipe.html'
    context_object_name = 'details'

到目前为止,我已经能够显示我的单个信息,没问题({{details.whatever}})

我的问题是指令和成分都作为外键关系存储在我的数据库中,因此需要以不同的方式输出。我的数据库如下所示:

class recipe(models.Model):
    title = models.CharField(max_length=255)
    description = models.TextField(default="No decsription added")
    image = models.ImageField(upload_to='images/',
                                        default='images/default.jpg')
    total_favourites = models.IntegerField()
    servings = models.IntegerField()

    def __str__(self):
        return self.title

class ingredients(models.Model):
    recipe = models.ForeignKey(recipe)
    ingredient = models.CharField(max_length=255)

我很难为我选择的食谱输出相关成分,我希望得到一些指示。

2 个答案:

答案 0 :(得分:1)

对于食谱对象,请说r

r.ingredients_set.all()将列出与该食谱相关的所有成分。

您可以进一步过滤: r.ingredients_set.filter(title__startswith='clover')

Django文档中有一个全面的指南: https://docs.djangoproject.com/en/1.9/topics/db/examples/many_to_one/

假设您想在views.py中找到食谱的所有成分列表:

ingredient_list = r.ingredients_set.all()

然后将上下文字典中的ingredient_list传递给模板。如果你不知道上下文字典是什么,你在做什么,请浏览Django文档!很多人投入了大量精力来创造出很好的文档。

假设context['ingredients'] = ingredient_list,其中context是您传递给模板html的上下文字典。 然后在您的模板中,使用Django模板语言:

{% for i in ingredients %}
  <p>{{ i.ingredient }}</p>
{% endfor %}

此处ingredients是您使用上下文字典传递的ingredient_list,而对于for循环中的每个成分对象i,您显示<ingredient object i>.ingredient <的值/ p>

这是官方教程的链接,如果有帮助的话。 https://docs.djangoproject.com/en/1.9/intro/tutorial01/

答案 1 :(得分:0)

见这里:https://docs.djangoproject.com/en/1.9/topics/class-based-views/generic-display/#adding-extra-context

class PublisherDetail(DetailView):

    model = Publisher


class RecipeView(generic.DetailView):
    model = recipe
    template_name = 'whatsfordinner/recipe.html'
    context_object_name = 'details'

    def get_context_data(self, **kwargs):
        # Call the base implementation first to get a context
        context = super(RecipeView, self).get_context_data(**kwargs)
        # Add in a QuerySet of all the books
        context['ingredient_list'] = recipe.ingredients_set.all()
        return context

以上是未经测试的