Django ORM:结合排除条件和不在过滤条件中

时间:2019-03-14 12:12:31

标签: django django-orm

对于此(高度简化)的Django模型设置:

class A(models.Model)

class B(models.Model)
  a = models.ForeignKey(A, null=True, blank=True)

class C(models.Model)
  b = models.ForeignKey(B, null=True, blank=True)

我想确保对于C上的查询来说,没有任何不是[a1,a2]的相关对象都属于查询。

类似的东西:

qs = C.objects.exclude(b__a__NOT_in=[a1, a2]).

我要搜索的是不是

qs = C.objects.filter(b__a__in=[a1, a2])

因为我的外键是可为空的,所以我也想获取途中任何fks为空的情况。

解决这个问题的最优雅的方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:2)

如果我的理解正确,那么您想要C个实例,其中const cypress = require('cypress') const marge = require('mochawesome-report-generator') const { merge } = require('mochawesome-merge') const currRunTimestamp = getTimeStamp(); const mergedReport = { reportDir: 'mochawesome-report', } const finalReport = { reportDir: 'reports', } cypress.run({ reporter: 'mochawesome', reporterOptions: { reportDir: 'mochawesome-report', overwrite: false, html: true, json: true } }).then( () => { generateReport() }, error => { generateReport() console.error(error) process.exit(1) } ) function generateReport(options) { return merge(mergedReport).then(report => marge.create(report, finalReport)) } 为null或b为null或b__ab__a之一。此处可能的解决方案是use the models.Q object建立一个(a1, a2)查询,即:

or

或仅"OR" querysets directly

from django.db.models import Q

query = Q(b__a__in=[a1, a2]) | Q(b__a__isnull=True) | Q(b__isnull=True)
qs = C.objects.filter(query)

这将产生完全相同的SQL查询,但是更加冗长...