Django:按值过滤或返回所有记录

时间:2018-06-20 19:57:45

标签: python django filter

我有以下代码段(django,python):

def function(self, some_id):
    if some_id:
        return Model1.objects.filter(model2__id=some_id)
    else:
        return Model1.objects.all()

我想知道是否可以使用单个return语句重构此代码? Model1在Model2.id上具有外键。

2 个答案:

答案 0 :(得分:4)

df4 <- data.frame(Y=rnorm(5))
df4$Z <- ceiling(df4$Y)

应该满足您的问题,尽管我认为按照书面规定,这很可能还可以。

答案 1 :(得分:2)

您可以通过以下方式解决此问题:

Invalid property assignment: "alignment" is a read-only property

但是这很神秘。

我个人喜欢实现一个def function(self, some_id): return Model1.objects.filter(*(some_id and [Q(model2__id=some_id)] or [])),它只是过滤掉以filter_not_none作为值的语句,例如:

None

然后我们可以简单地使用:

def filter_not_none(qs, **kwargs):
    return qs.filter(**{k: v for k, v in kwargs.item() if v is not None})

这适用于任意数量的 named 参数。因此不是位置参数或def function(self, some_id): return filter_not_none(Model1.objects, model2__id=some_id)对象。

这是有效的,因为Q没有参数,不会过滤任何内容。我们使用字典理解,从而检查哪个filter(..)的值不为kwargs,我们仅将其传递给None调用。

例如,您可以使用:

.filter(..)

return filter_not_none( Model.objects, name=some_name, date__lt=some_date ) some_name的情况下,我们不过滤名称,在Nonesome_date的情况下,我们不过滤None,如果两个都是date__lt,我们根本不会过滤,如果两个都是不是 None,我们都将过滤。

我们可以扩展它以使其也可以与None对象(以及Q)一起使用,但是要检查这些*args对象和表达式将非常困难,而且还可能导致各种不良行为。但是,一个扩展也需要Q个对象:

Q