很抱歉可能是简单的问题,但我是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)
答案 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')
请求同时提取相关对象。