如何在Python中为QuerySet创建switch语句

时间:2017-04-30 21:21:45

标签: python function switch-statement case

我一直在阅读一些关于交换机更换的帖子,例如:

但它们似乎都不符合我的需要。

我真正想要的是这样的事情

def f(x):
     switch(x):
         case 'pk':
         return User.objects.get(pk=x)
         case: 'email':
         return User.objects.get(email=x)

有没有一种简单的方法可以做到这一点?

4 个答案:

答案 0 :(得分:2)

不完全确定你的意思,但你可以像这样使用dict解包:

def f(param, value):
    return User.objects.get(**{param: value})

所以,

f('pk', key)

将返回

User.objects.get(pk=key)

答案 1 :(得分:1)

正如他们在上述一个问题中所说:

  

直接替换为if/elif/else

以下是适合您案例的示例

def f(x):
    if x == 'pk':
        return User.objects.get(pk=x)
    elif x == 'email':
        return User.objects.get(email=x)
    elif x == 'address':
        return User.objects.get(address=x)
    else:
        raise ValueError("x must be 'pk', 'email' or 'address'")

答案 2 :(得分:0)

试试这个

SELECT
    [MID],
    SUM([KEVAT 201501-04]) AS      'KEVAT 201501-04',
    SUM([KESA 201504-06]) AS       'KESA 201504-06',
    SUM([SYKSY 201507-09]) AS      'SYKSY 201507-09',
    SUM([TALVI 201510-12]) AS      'TALVI 201510-12',
    SUM([KEVAT 201601-04]) AS      'KEVAT 201601-04',
    SUM([KESA 201604-06]) AS       'KESA 201604-06',
    SUM([SYKSY 201607-09]) AS      'SYKSY 201607-09',
    SUM([TALVI 201610-12]) AS      'TALVI 201610-12'
FROM
(

SELECT * FROM TABLE1

UNION ALL

SELECT [MID]
        ,0 AS 'KEVAT 201501-04'
        ,0 AS 'KESA 201504-06'
        ,0 AS 'SYKSY 201507-09'
        ,0 AS 'TALVI 201510-12'
        ,[KEVAT 201601-04]
        ,[KESA 201604-06]
        ,[SYKSY 201607-09]
        ,[TALVI 201610-12]
FROM TABLE2

UNION ALL

SELECT [MID]
        ,[KEVAT 201501-04]
        ,[KESA 201504-06]
        ,[SYKSY 201507-09]
        ,[TALVI 201510-12]
        ,0 AS 'KEVAT 201601-04'
        ,0 AS 'KESA 201604-06'
        ,0 AS 'SYKSY 201607-09'
        ,0 AS 'TALVI 201610-12'
  FROM TABLE3
) a
GROUP BY [MID]

def f(x):
 switch = {
          'pk':(lambda val:User.objects.get(pk=val))
          'email':(lambda val:User.objects.get(email=val))
 }
 try:
    return switch[x](x)
 except KeyError:
    return default

答案 3 :(得分:0)

<强>定义

> str(c(f = f1, p = 0.2, vec = c(1,1), opt_pars, recursive= TRUE))
List of 5
 $ f      :function (x, vec)  
  ..- attr(*, "srcref")=Class 'srcref'  atomic [1:8] 1 7 1 36 7 36 1 1
  .. .. ..- attr(*, "srcfile")=Classes 'srcfilecopy', 'srcfile' <environment: 0x113e377c0> 
 $ p      : num 0.2
 $ vec1   : num 1
 $ vec2   : num 1
 $ hessian: logi TRUE

<强>用法

def custom_switch(value, cases={}, default=None):
    try:
        cases[value]()
    except KeyError:
        if default is not None: default()