@neznaikaaaa

Соединить две таблицы в одну Django

Имеются две таблицы
class modelA(models.Model):
owner = models.ForeignKey(User)
iditem = models.CharField(max_length=200)
category = models.CharField(max_length=200)
date = models.DateField()

class modelB(models.Model):
owner = models.ForeignKey(User)
iditem = models.CharField(max_length=200)
costs = models.CharField(max_length=200)
date = models.DateField()

Нужно соединить эти две таблицы в одну, по трем параметрам owner, iditem, date. В результате получить такую таблицу

class modelC(models.Model):
owner = models.ForeignKey(User)
iditem = models.CharField(max_length=200)
date = models.DateField()
costs = models.CharField(max_length=200)
category = models.CharField(max_length=200)

Также в modelB могут быть iditem, которых нет в modelA, их тоже надо перенести в modelC с category=0.

Помогите составить запросы.
  • Вопрос задан
  • 4584 просмотра
Пригласить эксперта
Ответы на вопрос 3
tema_sun
@tema_sun
Т.к. я запрос такой сходу составить не могу (надо читать, а это как всегда лень), то сделал бы так:
- в modelA добавил бы поле costs
- получил бы все объекты modelB ( .objects.all() ). И по этим результатам пробежался бы "for ... in ..." создавая новые объекты в modelA, на основне данных из modelB
Ответ написан
qmax
@qmax
программер
Если вам нужно именно слить таблицы прямо в базе - то вам нужен SQL, а не джанго.

А если вам нужно сделать "виртуальную таблицу" на уровне ORM, которая бы налету склеивала модель из двух других, то я бы покурил на тему model manager:
https://docs.djangoproject.com/en/1.6/topics/db/managers/
И написал бы к ModelC кастомного менеджера, котрый транслирует запросы objects.* в sql с joinами.
В принципе, в него можно встроить и сохранение моделей в разные таблицы.

Когда-то давно делал такое для слияния трёх таблиц из трёх разных баз (на разных серверах). Но это было с очень древним джангой.
Ответ написан
Комментировать
@r1ch
можно сделать представление, потом создать от нее модель
CREATE VIEW `ModelC` AS
SELECT `owner`, `iditem`, `date`, `costs`, `category` FROM `modelA`
INNER JOIN `modelB` ON `modelA`.`owner` = `modelB`.`owner` AND `modelA`.`iditem` = `modelB`.`iditem` AND `modelA`.`date` = `modelB`.`date`;

где `ModelA` название таблицы связанной с ModelA в базе данных
где `ModelB` название таблицы связанной с ModelB в базе данных
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы