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

2 投票
3 回答
3933 浏览
提问于 2025-04-16 12:54

抱歉问了一个可能很简单的问题,但我在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来实现这个?
或者我可以分别获取销售人员和商店,也就是说:

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

3 个回答

1

我不明白为什么即使数据库没有约束,你也不能使用 models.ForeignKey 字段。如果你不明确执行 SQL 来修改数据库,表格是不会改变的。如果你使用 ForeignKey,那么你可以用 Salespersons.objects.select_related('xsin') 来请求同时获取相关的对象。

2

如果你能让其中一个 xsin 字段变得唯一,那么你就可以使用外键(ForeignKey)和 to_field 来生成内部连接,像这样:

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')
3

根据你给的查询例子,你的 真的叫做 Salespersons/Store 吗?

不管怎样,像这样的写法应该是可以的:

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

不过,根据这些表/模型的名字来看,我觉得用内连接可能不太合适。除非你 总是 每个店只有一个销售员,并且他们的 xsin 是一样的。

撰写回答