Django 1.6 ORM加入

时间:2014-05-04 13:42:43

标签: sql django python-3.x orm

我正在尝试将特定投资组合中的所有资产显示在页面上。

我需要知道:A)。如何获得该组合的主键,B)。如何在代码中编写连接,以及C)。如果我甚至以正确的方式解决这个问题(另一个CBV或FBV会更合适,还是函数get_assets()没问题?)。

数据库设置:

class Portfolios(models.Model):
    #code

class PortfoliosAssets(models.Model):
    portfolio = models.ForeignKey(Portfolios)
    asset = models.ForeignKey(Assets)

class Assets(models.Model):
    #code

SQL我想用ORM编写:

SELECT A.ticker 
FROM assets A 
    INNER JOIN portfolios_assets PA ON PA.asset = A.id
WHERE PA.portfolio = --portfolio_pk

代码:

class ShowPortfolios(DetailView):
    model = Portfolios
    template_name = 'show_portfolios.html'

    def get_assets(self):
        #obviously not how to get the portfolios pk or columns from the ASSETS table.
        assets = PortfoliosAssets.objects.get(portfolio=portfolio_pk)
        for asset in assets:
           #run some query to get each asset's info but this seems obviously wrong.

1 个答案:

答案 0 :(得分:0)

投资组合与资产之间的关系是多对多的。您应该明确定义,并完全删除PortfolioAsset模型(Django将为您创建一个等效的m2m连接表)。

class Portfolio(models.Model):
    assets = models.ManyToManyField("Asset")

(注意,惯例是对模型使用单数名称,而不是复数。)

完成后,您根本不需要额外的方法:您只需通过portfolio.assets.all()从投资组合中访问资产即可。或者,在模板中:

{% for asset in portfolio.assets.all %}
    {{ asset.ticker }}
{% endfor %}