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?
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())
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
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?
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())
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