Я думаю, с помощью комбинации Annotation
QuerySet и пользовательской функции, которая сериализует ваши данные, вы можете решить вашу проблему.
Вот пример того, как вы можете это сделать:
import json
from django.db.models import F
def custom_serializer(a):
"""
Handy creation of the Queryset fields
And we exclude the fields that starts by '__'
which are Django internal references
This will lead to the representation of the annotated fields
that are generated by the QuerySert annotation
which are ignored by serializers.serialize() function
"""
return [{
'model': a.model.__name__, 'pk': k.pk, 'fields': {
i: j for i, j in k.__dict__.items() if not i.startswith('_')
}
} for k in a]
# Here we annotate a new field called username
# which holds the user's username using the F expression
top_users = HighScore.objects.order_by('highScore').filter(
highScore__in=top_score[:10]
).annotate(username=F('user__username'))
top_users_serialized = custom_serializer(top_users)
print(json.dumps(top_users_serialized))
Вы получите что-то вроде этого:
[{
"model": "scoremg.highscore",
"pk": 2,
"fields": {
"id": 2, # pk
"user_id": 2 # your user id
"username": "test", # your user's username
"highScore": 650,
"createDate": "2018-12-25T20:34:51.826Z"
}
},
...
]
Редактировать:
Лучший подход без использования пользовательской функции, вы можете использовать метод queryset.values()
как этот пример:
top_users = HighScore.objects.order_by('highScore').filter(
highScore__in=top_score[:10]
).annotate(username=F('user__username'))
top_users_serialized = [elm for elm in top.users.values()]
print(json.dumps(top_users_serialized))
Вы получите что-то вроде этого:
[{
"id": 2, # pk
"user_id": 2 # your user id
"username": "test", # your user's username
"highScore": 650,
"createDate": "2018-12-25T20:34:51.826Z"
},
...
]
Для получения дополнительной информации, пожалуйста, обратитесь к: F () выражение , Аннотация QuerySet и Значения QuerySet