跟随Django ForeignKey关系倒退

时间:2014-02-20 21:01:40

标签: python django django-models relational-database

我有一个Django网站,我想在其中显示两个图表(Charta和 Chartb)获取股票清单,但我很难定义我的模型。对 现在,我的models.py中有多个相关的表:

from django.db import models

class Stock(models.Model):
    name = models.CharField(max_length=100)
    company = models.CharField(max_length=100)

    def __unicode__(self):
      return self.name

class Charta(models.Model):
    stock = models.ForeignKey(Stock)
    x_axis = models.IntegerField(default=0)
    y_axis = models.IntegerField(default=0)

class Chartb(models.Model):
    stock = models.ForeignKey(Stock)
    x_axis = models.IntegerField(default=0)
    y_axis = models.IntegerField(default=0)

我的目标是建立一个股票页面,列出我股票表格中的所有股票,以及 然后是每个股票的详细信息页面,我可以在其中显示x和y坐标 每张图表。 (一旦我有这些坐标,我可以绘制它们,但是现在我是 只是在屏幕上打印坐标而苦苦挣扎。到目前为止,我的views.py 文件看起来像这样:

from django.shortcuts import render, get_object_or_404
from stocks.models import Stock, Charta, Chartb

def index(request):
    stock_list = Stock.objects.all()
    context = {'stock_list': stock_list}
    return render(request, 'stocks/index.html', context)

def detail(request, stock_id):
    stock = get_object_or_404(Stock, pk=stock_id)
    return render(request, 'stocks/detail.html', {'stock': stock})

以这种方式做事,我能够轻松获得显示所有股票的股票页面 在我的表中,使用以下index.html将每个链接到详细信息页面 文件:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
    <head>
    </head>
    <body>
    <h1>Stocks</h1>

    {% if stock_list %}
        <ul>
        {% for stock in stock_list %}
            <li><a href="/stocks/{{ stock.id }}/">{{ stock.name }}</a></li>
        {% endfor %}
        </ul>
    {% else %}
        <p>No stocks are available.</p>
    {% endif %}

    </body>
</html>

我遇到的问题是在细节中显示每只股票的坐标 页。我想有一个details.html页面,如下所示:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
    <head>
    </head>
    <body>
    <h1>Stock Details</h1>

    <!-- This works fine -->
    <p>The name of this stock is <strong>{{ stock.name }}</strong> </p> <br>
    <p>This stock comes from <strong>{{ stock.company }}</strong> </p> <br>

    <!-- This doesn't work -->
    <p>The x values for this stock are: </p>
        <ul>
        {% for x_val in stock.charta.x_axis %}
            <li>x_val</li>
        {% endfor %}
        </ul>
    <p>The y values for this stock are: </p>
        <ul>
        {% for y_val in stock.charta.y_axis %}
            <li>y_val</li>
        {% endfor %}
        </ul>

    </body>
</html>

但是,我无法用类似的东西调用x_values和y_values stock.charta.x_axis。有没有更好的方法可以设置我的模型 我可以访问详细信息页面内每个股票的图表数据吗? 直观地说,有一个表格列出股票,然后到 使用某种SQL连接访问每个图表的数据。

我在github上发布了这个项目的最小例子here

谢谢!

2 个答案:

答案 0 :(得分:3)

ChartaChartb的{​​{1}}字段为ForeingKey,因此当您Stockone-to-many时,您正在处理Stock关系侧。

在您的代码中,您有:

{% for x_val in stock.charta.x_value %}
    <li>x_val</li>
{% endfor %}

但那是错的。如果要从Charta对象访问Stock对象,则必须编写:

{% for charta in stock.charta_set.all %}
    <li> {{ charta.x_axis }} </li>
{% endfor %}

请注意 charta_set 更改。这是因为Django默认生成,object manager称为charta_setchartb_set。{/ p>

您可以修改模型,以便为charta中的charbstock个对象指定“关系名称”。

class Charta(Model):
    ...
    stock = models.ForeignKey(Stock, related_name='charta')
    ...

将模板代码更改为:

{% for charta in stock.charta.all %}
    <li>{{ charta.x_axis }}</li>
{% endfor %}

答案 1 :(得分:1)

在模板中调试非常困难,因为错误被抑制了!!在视图中调试要容易得多

def detail(request, stock_id):
    stock = get_object_or_404(Stock, pk=stock_id)
    import pdb; pdb.set_trace();
    return render(request, 'stocks/detail.html', {'stock': stock})

以上允许在import pdb语句中暂停程序,并允许您检查库存对象。

默认情况下,在django中,reverse foreignkey在<<model>>_set属性中导航

stock.charta_set将返回经理而不是实际的图表实例。要做到这一点应该是

stock.charta_set.all()

或在您的模板中:

stock.charta_set.all