我有以下模型:
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
213a0返回预期的结果,但是
>>> a7.cid.id
2111
>>> a7.pid.id
2111a7没有返回预期的结果!预期的结果是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-log
发布于 2020-07-31 00:08:40
幸运的是,我找到了一种更好的方法来使用一个查询集获得相同的结果,也就是使用Q对象,查询集将是:
all = Npr.objects.filter(Q(pid=198) | Q(cid=198))https://stackoverflow.com/questions/60698643
复制相似问题