How to add extra key-value to QuerySet lists?

Question:

I am working with Django,i need to retrieve data from multiple database, which has different database name but with same table column structure.
So I use model.using(database).all()to get queryset and merge them into one.
I want to add extra databasename to indicate the data’s database name, this is my code.
model:

class Sections(models.Model):
    apply_id = models.PositiveIntegerField()
    pathology_id = models.CharField(max_length=128)
    user_id = models.PositiveIntegerField()
    updated_at = models.DateTimeField(blank=True, null=True)

get_queryset:

def get_queryset(self):
    slideset = []
    database_config = ['database1', 'database2', 'database3']
    for i, x in database_config:
        slides = Sections.objects.using(x).all()
        #### I want to add extra databasename column in every query object.
        for x1 in slides:
            x1.databasename = x
        ######
        slideset.append(slides)
    
    # merge QuerySet
    query = functools.reduce(lambda a, b: a|b, slideset)
    return query.order_by("updated_at").reverse()

the one return will be :

  {
        "apply_id": 1123,  
        "pathology_id": 1235,  
        "user_id": 1,  
        "updated_at": "202106011430",  
        # add extra databasename. 
        "databasename": "database1". 
    }

Because the column can’t be modify, so I had to leave Sections model unchange, just add extra key-value to query, can someone help me on that?

Asked By: gcdsss

||

Answers:

thanks to @Abdul Aziz Barkat

use annotate

from django.db.models import CharField, Value
slides = Sections.objects.using(x).annotate(databasename=Value(databasename, output_field=CharField())
Answered By: gcdsss

I have a list of queryset object of users as you know we can take only that parms in values list wich is presents inside own model. but in my case i need one more key value pair, I tried to put directly inside in the values() then we will get an key error. to over come this problem see in below:

I have user Case with when inside annotate

from django.db.models import F, When, Case, BooleanField
from django.contrib.auth.models import User
users_list = User.objects.filter(registration__status=status_type).values(
        'id', 'username', 'first_name', 'last_name', 'email',).annotate(is_logged_in=Case(When(
            email=request.user.email, then=True),default=False, output_field=BooleanField()))

OutPut:

{
  "id": XX,
  "username": "demo.user",
  "first_name": "Demo",
  "last_name": "User",
  "email": "[email protected]",
  "phone_number": "111111111",
  "is_logged_in": true
},

As you can see i have added one extra key value in the above json "is_logged_in": True (only for logged in user) rest of the user false

Answered By: Hemant Yadav
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.