使用django的简单数据库内连接

时间:2014-03-21 10:47:20

标签: python django orm

我使用inspectdb

导入到我的django应用程序的遗留数据库中有两个表

这是我的模型定义

class AppCosts(models.Model):
    cost = models.DecimalField(max_digits=10, decimal_places=2)


class AppDefinitions(models.Model):
    data = models.TextField()
    permissions = models.CharField(max_length=50, blank=True)
    appcost=models.OneToOneField(AppCosts, db_column='id')

AppDefinitions中的每个应用都在AppCosts中有一个条目 - 一对一的关系

当我使用select_related()时,我得到:

>>> AppDefinitions.objects.select_related().query.__str__()

    u'SELECT _app_definitions.id, _app_definitions.data,
  _app_definitions.permissions, _app_definitions.id, _app_costs.id, 
  _app_costs.cost FROM _app_definitions INNER JOIN _app_costs 
  ON ( _app_definitions.id = _app_costs.id )'

>>> a = AppDefinitions.objects.select_related().first()

>>> a.id
u'abaqus'

>>> a.cost
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'AppDefinitions' object has no attribute 'cost'

>>> a.appcost
<AppCosts: abaqus,1.50>    

>>> a.appcost.cost
Decimal('1.50')

现在有两个问题:

  • 查询从两个字段中提取两次id(不是很大,因为这个表最多不会超过几百个条目,但仍然,我希望它是正确的)
  • 我必须以x.appcost.cost访问费用,而不仅仅是x.cost

我如何实现这一目标?

我不愿意使用自定义SQL,因为这首先会破坏使用django&#ORM的目的。

1 个答案:

答案 0 :(得分:1)

你说你想使用Django的ORM,但后来说你想做一些截然相反的事情,即以x.cost的形式访问费用。

Django不会让你这样做,因为它完全打破了对象模型。 cost是AppCosts模型的属性,而不是Costs的属性。如果它真的困扰你,你可以在费用上添加property,返回self.appcosts.cost,只要您不尝试在其中使用它就会执行您想要的操作查询。