首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >联合查询集没有给出预期的结果,是Django ORM错误吗?

联合查询集没有给出预期的结果,是Django ORM错误吗?
EN

Stack Overflow用户
提问于 2020-03-16 07:17:42
回答 1查看 32关注 0票数 0

我有以下模型:

代码语言:javascript
复制
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'),)

我构建了以下查询集:

代码语言:javascript
复制
idf = Npr.objects.select_related('cid').filter(pid = 198)
ids = Npr.objects.select_related('pid').filter(cid = 198)
all = ids.union(idf)

得到的SQL语句是:

代码语言:javascript
复制
(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数据是:

代码语言:javascript
复制
+------+-----+-----+------+
| 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  |
+------+-----+-----+------+

现在看看下面的内容

代码语言:javascript
复制
>>> a0=all[0]
>>> a7=all[7]
>>> 
>>> a0.cid.id
198
>>> a0.pid.id
213

a0返回预期的结果,但是

代码语言:javascript
复制
>>> a7.cid.id
2111
>>> a7.pid.id
2111

a7没有返回预期的结果!预期的结果是a7.pid.id=198。此外,a0.cid.id会将以下SQL语句发送到数据库:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-31 00:08:40

幸运的是,我找到了一种更好的方法来使用一个查询集获得相同的结果,也就是使用Q对象,查询集将是:

代码语言:javascript
复制
all = Npr.objects.filter(Q(pid=198) | Q(cid=198))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60698643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档