过滤基于列表的查询集,包括无

时间:2010-04-26 22:11:21

标签: python sql mysql django orm

我不知道它是一个django错误还是一个功能,但我对MySQL有一个奇怪的ORM行为。

class Status(models.Model):
    name = models.CharField(max_length = 50)

class Article(models.Model)
    status = models.ForeignKey(status, blank = True, null=True)


filters = Q(status__in =[0, 1,2] ) | Q(status=None) 
items = Article.objects.filter(filters) 

这会返回文章项目,但有些项目还有其他状态而不是请求[0,1,2,无]

查看sql查询:

SELECT [..] FROM `app_article` LEFT OUTER JOIN `app_status` ON (`app_article`.`status_id` = `app_status`.`id`) WHERE (`app_article`.`status_id` IN (1, 2) OR `app_status`.`id` IS NULL) ORDER BY [...]

OR app_status.id IS NULL部分似乎是原因。如果我将其更改为OR app_article.status_id IS NULL它可以正常工作。

如何处理?

感谢名单。

2 个答案:

答案 0 :(得分:1)

请尝试使用此查询:

filters = Q(status__in =[0, 1,2] ) | Q(status__isnull=True) 

答案 1 :(得分:0)

在Article模型的外键属性中,您使用小写的's'引用status。但是你的Status模型有一个大写的'S'。不确定你的拼写错误在哪里,但是如果你的模型实际上是用小写的''定义的,那么这可能解释你所看到的奇怪的SQL。