如何在遗留数据库中的Django中进行INNER JOIN?

时间:2011-03-03 08:23:41

标签: python django django-models

很抱歉可能是简单的问题,但我是Django的新手,真的很困惑。

我有一个丑陋的遗产表,我无法改变。
它有2个表:

class Salespersons(models.Model):
    id = models.IntegerField(unique=True, primary_key=True)
    xsin = models.IntegerField()
    name = models.CharField(max_length=200)
    surname = models.CharField(max_length=200)

class Store(models.Model):
    id = models.IntegerField(unique=True, primary_key=True)
    xsin = models.IntegerField()
    brand = models.CharField(max_length=200)

所以我想我不能在类定义中添加外键,因为它们会更改表。

我需要执行这样的sql请求:

SELECT * FROM Salespersons, Store INNER JOIN Store ON (Salespersons.xsin = Store.xsin);

如何使用Django ORM实现它?
或者我可以分别获得Salespersons和Store,即

stores = Store.objects.filter(xsin = 1000)
salespersons = Salespersons.objects.filter(xsin = 1000)

3 个答案:

答案 0 :(得分:2)

根据您的示例查询,您的实际上是否命名为Salespersons / Store? 无论如何,这样的事情应该有效:

results = Salespersons.objects.extra(tables=["Store"],
                          where=["""Salespersons.xsin = Store.xsin"""])

然而,鉴于表/模型的名称,我认为内连接在逻辑上是正确的。除非您总是每个商店只有1个销售人员,且xsin

答案 1 :(得分:2)

如果您可以使其中一个xsin字段唯一,则可以使用带有to_field的ForeignKey生成内部联接,如下所示:

class Salespersons(models.Model):
    xsin = models.IntegerField(unique=True)

class Store(models.Model):
    xsin = models.ForeignKey(Salespersons, db_column='xsin', to_field='xsin')

>>> Store.objects.selected_related('xsin')

答案 2 :(得分:1)

我不明白为什么即使数据库缺少约束也不能使用models.ForeignKey字段 - 如果您没有显式执行SQL来更改数据库,那么表将不会更改。如果您使用ForeignKey,则可以使用Salespersons.objects.select_related('xsin')请求同时提取相关对象。