使用外键在django ORM中连接两个表

时间:2018-01-16 09:34:55

标签: python django django-models django-orm

我是Django的初学者。我正面临着通过Foregin Keys加入的模型的问题。

我有两个型号"内部订单2" "职位3"如下所述。 我想使用Django ORM加入表格。

的应用程序/ models.py

class Internalorder2(models.Model):
   order_id = models.AutoField(primary_key=True)
   ticker = models.CharField(max_length=64)

   class Meta:
      managed = True
      db_table = 'internalorder2'

的应用程序/ models.py

class Position3(models.Model):
   pos_id = models.AutoField(primary_key=True)
   parent_order = models.OneToOneField(Internalorder2, models.DO_NOTHING)
   action = models.CharField(max_length=4)

   class Meta:
      managed = True
      db_table = 'position3'

接下来我填充了两个表格。之后,我运行一个查询来提取 使用select_related函数跨越两个表的查询集。 我期望从查询中查看查询集中的表Internalorder2的所有字段。然而, 查询集仅包含来自它自己的表,position3的字段。

python manage.py shell命令

from app.models.py import *
qs= Position3.objects.all().select_related("parent_order")

python shell结果

In [102]: qs[0].__dict__

Out[102]:
{'_parent_order_cache': <Internalorder2: Internalorder2 object>,
'_state': <django.db.models.base.ModelState at 0x13209f0>,
'action': 'B',
'parent_order_id': 1,
'pos_id': 1}

我可以访问 来自表Internalorder2的字段使用命令:

python shell结果

In [112]: qs[0].parent_order.ticker
Out[112]: 'ACC'

但是,这不是我想要的。我希望foregin表中的所有字段都添加到queryset中 queryset作为输入提供给其他插件。

任何涉及只对数据库进行查询的解决方案?

2 个答案:

答案 0 :(得分:0)

我仍然无法完全理解这个问题。但是使用.OneToOneField链接的2个模型,您可以这样做:

pos = Position3.objects.all()
# Got all the pos (you can do filter or something else
# then with the object pos, you can get the parent_order like:
order = pos.parent_order # Or for p in pos: or = p.parent_order
# And FK make one to many relationship, OneToOne ~> same way

答案 1 :(得分:0)

你没有做错任何事。股票代码字段位于相关的InternalOrder字段中;您可以通过new[0].parent_order.ticker访问它。