2014-02-20 106 views
0

我有一个Django网站,我想显示两个图表(Charta和 Chartb)以获取股票列表,但我正在努力定义我的模型。右 现在,我在我的models.py多个相关表:继Django ForeignKey关系向后

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

谢谢!

+1

你意味着'x_value'是'x_axis'? 'y_value'分别。 – gwaramadze

+0

@pythonishvili:啊,是的。谢谢 - 这是一个错字。我已经编辑了这个问题 - 尽管如此,代码仍然不适用于这些更改。 – Steve

回答

3

ChartaChartbStock一个ForeingKey场,所以你正在处理一个one-to-many关系,当Stock是一边。

在你的代码有:

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

但这是错误的。如果你想从一个Stock对象访问Charta对象,你必须写:

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

注意charta_set变化。这是Django默认生成的,object manager称为charta_setchartb_set

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

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

并更改模板代码:

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

编辑!我只是修正了一些错误。 –

+0

谢谢 - 这正是我一直在寻找的!我记得在教程中阅读了关于属性的<,但我想我从来没有完全理解它。 – Steve

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}) 

调试以上允许将在进口PDB声明暂停你的程序,并允许你检查你的股票对象。

默认情况下在Django,reverse外键通过<<model>>_set财产

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

stock.charta_set.all()

或在您的模板:

stock.charta_set.all

+0

谢谢!这是有帮助的 – Steve