Как я могу сделать INNER JOIN в Django в устаревшей базе данных? - PullRequest
2 голосов
/ 03 марта 2011

Извините за, возможно, простой вопрос, но я новичок в 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 ]

2 голосов
/ 03 марта 2011

Если вы можете сделать одно из полей 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')
2 голосов
/ 03 марта 2011

Учитывая ваш пример запроса, ваши таблицы на самом деле называются Salespersons / Store?В любом случае, что-то вроде этого должно работать:

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

Однако , учитывая имена таблиц / моделей, мне не кажется, что внутреннее соединение будет логически правильным.Если у вас не всегда есть только 1 продавец в магазине с таким же xsin.

1 голос
/ 03 марта 2011

Я не понимаю, почему вы не можете использовать поля models.ForeignKey, даже если в базе данных отсутствуют ограничения - если вы не выполняете явно SQL-запрос для изменения базы данных, таблицы не изменятся. Если вы используете ForeignKey, то вы можете использовать Salespersons.objects.select_related('xsin') для запроса одновременной выборки связанных объектов.

...