我有以下代码段(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上具有外键。
答案 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
的情况下,我们不过滤名称,在None
是some_date
的情况下,我们不过滤None
,如果两个都是date__lt
,我们根本不会过滤,如果两个都是不是 None
,我们都将过滤。
我们可以扩展它以使其也可以与None
对象(以及Q
)一起使用,但是要检查这些*args
对象和表达式将非常困难,而且还可能导致各种不良行为。但是,一个扩展也需要Q
个对象:
Q