简体   繁体   中英

Django: annotate queryset with string

I need to annotate a queryset with strings from dictionary. The dictionary keys come from the model's field called 'field_name'.

I can easily annotate with strings from dictionary using the Value operator:

q = MyModel.objects.annotate(new_value=Value(value_dict[key], output_field=CharField()))

And I can get the field value from the model with F expression:

q = MyModel.objects.annotate(new_value=F('field_name'))

Putting them together however fails:

# doesn't work, throws
# KeyError: F(field_name)    
q = MyModel.objects.annotate(new_value=Value(value_dict[F('field_name')], output_field=CharField()))

Found this question, which afaiu tries to do the same thing but that solution throws another error:

Unsupported lookup 'field_name' for CharField or join on the field not permitted.

I feel like I'm missing something really obvious here but I just can't get it to work. Any help appreciated.

Right, just as I thought, a tiny piece was missing. The Case(When(... solution in the linked question worked, I just needed to wrap the dictionary value in Value() operator as follows:

qs = MyModel.objects.annotate(
    new_value=Case(
        *[ When(field_name=k, then=Value(v)) for k,v in value_dict.items() ],
        output_field=CharField()
    )
)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM