как использовать аннотацию Django с внешним ключом - PullRequest
0 голосов
/ 16 ноября 2018

Рассмотрим простые модели Django

class Journey(models.Model):
    vrn=models.CharField(max_length=200) # Vehicle Reg No
    kilo=models.FloatField()

class J_user(models.Model):
    jdi=models.ForeignKey(Journey, related_name="Journey_User",on_delete = models.DO_NOTHING,)
    uid=models.IntegerField()

Легко аннотировать в одной таблице, например, если мы хотим получить общее количество пройденных километров для каждого транспортного средства (vrn представляет регистрационный номер транспортного средства)

Journey.objects.values('vrn').annotate(Total_kilo=Sum('kilo'))

Теперь я хочу сделать запрос, который будет возвращать количество километров, пройденных каждым пользователем в каждой машине.

Таблица данных о поездке

enter image description here

Данные таблицы J_user

enter image description here

Тогда результат должен быть

enter image description here

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

По вашим моделям должно быть:

J_user.objects.values('uid', vrn=F('jdi__vrn')).annotate(kilo=Sum('jdi__kilo'))
0 голосов
/ 16 ноября 2018

Это ваш запрос:

Journey
.objects
.order_by()   #<-- important to avoid include sort fields
.values('vrn', 'j_user__uid', )
.annotate(Total_kilo=Sum('kilo'))

Поля на values будут включены в предложение агрегации. Пример:

print(
    Material
    .objects
    .values( "uf_id", "uf__mp__id", )
    .annotate( Sum("total_social_per_c") )
    .query )

Результат:

SELECT "material_material"."uf_id", 
       "ufs_uf"."mp_id", 
       Sum("material_material"."total_social_per_c") AS 
       "total_social_per_c__sum" 
FROM   "material_material" 
       INNER JOIN "ufs_uf" 
               ON ( "material_material"."uf_id" = "ufs_uf"."id" ) 
GROUP  BY "material_material"."uf_id", 
          "ufs_uf"."mp_id" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...