У меня есть две абсолютно идентичные модели по структуре:
class Model_A (models.Model)
id_value = models.CharField(primary_key=True, max_length=45)
some_value_1 = models.IntegerField(blank=True, null=True)
some_value_2 = models.TextField(blank=True, null=True)
#and etc. I have many fields
class Model_B (models.Model)
id_value = models.CharField(primary_key=True, max_length=45)
some_value_1 = models.IntegerField(blank=True, null=True)
some_value_2 = models.TextField(blank=True, null=True)
#and etc. I have many fields
Во-первых, я пытаюсь сравнить все значения полей друг с другом.
Во-вторых, если параметры не совпадаюти запишите ответ в третьей таблице (указав каждое неравенство по его идентификатору и имени поля).
class Third_Model(models.Model):
auto_increment_id = models.AutoField(primary_key=True)
id_value = models.CharField(max_length=45, null=False)
manage_objects = models.CharField(blank=True, null=True)
field_name = models.CharField(blank=True, null=True)
value_from_A = models.CharField(blank=True, null=True)
value_from_B = models.CharField(blank=True, null=True)
Как мне выполнить это действие с использованием моделей Python?При условии, что в моделях много полей, а самих моделей более 40 штук.
Вот пример того, что я хочу сделать с примером запроса sql.
INSERT INTO `third_table` (`id_value`, `manage_objects`,`field_name`, `value_from_A`, `value_from_B`)
SELECT id_value, manage_objects, param_name, fld_param , ref_param FROM
(SELECT id_value, 'Model_name' AS manage_objects, param_name, max(val1) AS fld_param, max(val2) AS ref_param
FROM ((SELECT id_value, 'some_value_1' AS param_name, some_value_1 AS val1, Null AS val2
FROM model_a
) UNION ALL
(SELECT id_value, 'some_value_2' as param_name, some_value_2 AS val1, Null AS val2
FROM model_a
)UNION ALL
(SELECT id_value, 'some_value_1' as param_name, Null AS val1, some_value_1 AS val2
FROM model_b
) UNION ALL
(SELECT id_value, 'some_value_2' as param_name, Null AS val1, some_value_2 AS val2
FROM model_b
)
) tcd
GROUP BY id_value, param_name
HAVING NOT max(val1) <=> max(val2)) as inconsis
WHERE CAST(fld_param AS CHAR) !='Null' AND CAST(ref_param AS CHAR) !='Null';
Вот что я в идеале хочу получить:
Я бы хотел сгруппировать несоответствия по их идентификатору и имени поля.
У меня есть 1 таблица и 2 таблицы с одинаковыми идентификаторами.
Table model_a
+------+------------+-------------+---------------+-------------------------+
| # | id_value | some_value_1| some_value_2 | some_value_3 |
+------+------------+-------------+---------------+-------------------------+
| 1523 | Wien | AUT | Wien | {"Population": 1608144} |
| 1524 | Graz | AUT | Steiermark | {"Population": 240967} |
| 1525 | Linz | AUT | North Austria | {"Population": 188022} |
+------+------------+-------------+---------------+-------------------------+
Table model_b
+------+------------+-------------+---------------+-------------------------+
| # | id_value | some_value_1| some_value_2 | some_value_3 |
+------+------------+-------------+---------------+-------------------------+
| 1523 | Wien | RUS | Wien | {"Population": 666666} |
| 1524 | Graz | AUT | | {"Population": 240967} |
| 1525 | Linz | AUT | North Austria | {"Population": 188022} |
+------+------------+-------------+---------------+-------------------------+
Table third_model
+---+------------+------------------+--------------+------------------------+-------------------------+----------------------+
| # | id_value | manage_objects | field_name | value_from_a | value_from_b | auto_increment_id |
+---+------------+------------------+--------------+------------------------+-------------------------+----------------------+
| 1 | Wien | model_a | some_value_1 | AUT | RUS | 1 |
| 2 | Wien | model_a | some_value_3 |{"Population": 1608144} | {"Population": 666666} | 2 |
| 3 | Graz | model_a | some_value_2 | | Steiermark | 3 |
+---+------------+------------------+--------------+------------------------+-------------------------+----------------------+