Набор запросов Union не дает ожидаемого результата. Это ошибка Django ORM? - PullRequest
0 голосов
/ 16 марта 2020

У меня есть следующие модели:

class PersonDetails(models.Model):
    id = models.AutoField(db_column='ID', primary_key=True)
    name= models.CharField(db_column='Name', max_length=20, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'person_details'


class Npr(models.Model):
    rid = models.AutoField(db_column='rid', primary_key=True)
    pid = models.ForeignKey(PersonDetails, on_delete=models.CASCADE, db_column='PID')
    rel = models.CharField(max_length=1)
    cid = models.ForeignKey(PersonDetails, on_delete=models.CASCADE, db_column='CID')

    class Meta:
        managed = False
        db_table = 'npr'
        unique_together = (('pid', 'cid'),)

Я построил следующий набор запросов:

idf = Npr.objects.select_related('cid').filter(pid = 198)
ids = Npr.objects.select_related('pid').filter(cid = 198)
all = ids.union(idf)

, и результирующий оператор SQL выглядит так:

(SELECT `npr`.`rid`, `npr`.`PID`, `npr`.`rel`, `npr`.`CID`, T3.`ID`, T3.`Name` FROM `npr` INNER JOIN `person_details` T3 ON (`npr`.`PID` = T3.`ID`) WHERE `npr`.`CID` = 198) 
    UNION
(SELECT `npr`.`rid`, `npr`.`PID`, `npr`.`rel`, `npr`.`CID`, T3.`ID`, T3.`Name` FROM `npr` INNER JOIN `person_details` T3 ON (`npr`.`CID` = T3.`ID`) WHERE `npr`.`PID` = 198)

мои данные Npr:

+------+-----+-----+------+
| rid  | PID | rel | CID  |
+------+-----+-----+------+
| 40   | 198 | F   | 2111 |
| 42   | 198 | F   | 2110 |
| 1377 | 198 | F   | 1243 |
| 3305 | 198 | F   | 236  |
| 3379 | 198 | F   | 203  |
| 3384 | 198 | H   | 200  |
| 3388 | 213 | F   | 198  |
| 3389 | 218 | M   | 198  |
+------+-----+-----+------+

Теперь посмотрите на следующее

>>> a0=all[0]
>>> a7=all[7]
>>> 
>>> a0.cid.id
198
>>> a0.pid.id
213

a0 возвращает ожидаемые результаты, но

>>> a7.cid.id
2111
>>> a7.pid.id
2111

a7 не возвращает ожидаемый Результаты! ожидаемый результат a7.pid.id = 198. К тому же; a0.cid.id отправляет следующий оператор SQL в базу данных:

SELECT `person_details`.`ID`, `person_details`.`Name` FROM `person_details` WHERE `person_details`.`ID` = 198 LIMIT 21

, а a0.pid.id - нет. Почему вторая часть набора запросов объединения не дает правильных результатов!?

Django Версия: 3.0.4 Python версия: 3.7.3 База данных: 10.3.22-MariaDB-0 + deb10u1- журнал

...