1

I have data format like this:

[
 {
  "name":"abc",
  "number":120,
  "total":500
 },
 {
  "name":"def",
  "number":30,
  "total":400
 }

]

and I have a django query logic like this:

Table.objects.update(
      number = Case(
          When(name=data[0]['name'], then=Value(data[0]['number'])),
          When(name=data[1]['name'], then=Value(data[1]['number'])),
          When(name=data[2]['name'], then = Value(data[2]['number'])),
          ...
          When(name=data[499]['name'], then = Value(data[499]['number'])),
          default=F('number'),
      )
  )

I want to use code to generate the When part

so I use list comprehension to generate it, and then use ','.join(query_list) to remove the bracket [ ]
But here is problem : it said TypeError: sequence item 0: expected string, When found

I can't convert it to string , because When(name=data[499]['name'], then = Value(data[499]['number']) should be a object. How can I do to fix this???

query_list = [When(name=data[i]['name'], then=Value(data[i]['number'])) for i,item in enumerate(data)]

part_of_sql= ','.join(query_list)
print(part_of_sql)


Table.objects.update(
   number=Case(
     part_of_sql, 
     default=F('number'),
   )
)

1 Answer 1

2

Try unpack query_list when passing it to Case with * syntax:

Case(*query_list, default=F('number')
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks, it works Table.objects.update(number=Case(default=F('number'), *query_list))

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.