Django - математическая операция между свойством 2 отдельных экземпляров в модели - PullRequest
1 голос
/ 08 апреля 2020

Это мой первый пост здесь .. Так что, если я что-то упустил или сделал что-то не так ... Мне очень жаль

Моя модель

class state(models.Model):
   name = models.CharField(max_length =50, null= True)
   def __str__(self):
    return self.name

class county(models.Model):
   name = models.CharField(max_length =50, null= True)
   stateName = models.ForeignKey(state, null= True, on_delete = models.SET_NULL)
   def __str__(self):
    return self.name


class cityPopulation(models.Model):
   forCounty = models.ForeignKey(county, null= True, on_delete = models.SET_NULL)
   city1Popultaion = models.IntegerField(null =True, blank =True)
   city2Population = models.IntegerField(null =True, blank =True)
   def __str__(self):
    return self.forCounty.name + str("'s population data")

   @property
   def totalPoulation(self):
     total = int(self.city1Popultaion + self.city2Population)
     return total

Вот мой вопрос

с помощью totalPouplation я могу получить общее количество каждого экземпляра cityPopulation.

Допустим, у нас есть 2 штата с 2 округами с city1 и city2 каждый

- это простой способ получить общее население всех округов в каждом штате

Любая помощь было бы здорово, спасибо большое

Я только учусь Django .. так что я очень начинающий

1 Ответ

0 голосов
/ 08 апреля 2020

Вы можете аннотировать объекты State:

from django.db.models import F, Sum

state.objects.annotate(
    population=Sum(F('country__citypopulation__city1Popultaion')+F('country__citypopulation__city2Population'))
)

Объекты state, которые возникают из этого набора запросов, будут иметь дополнительный атрибут .population, который содержит сумму связанных объектов cityPopulation связанных city объектов.

Обратите внимание, что вы сделали опечатку в поле city1Popultaion, это должно быть city1Population. Кроме того, поля обычно записываются в snake_case, поэтому обычно пишется как city1_population.

Примечание : обычно это Django модели, как и все классы в Python получают имя в PerlCase , а не snake_case , поэтому оно должно быть: State вместо state.

РЕДАКТИРОВАТЬ : Для одного State вы можете использовать:

from django.db.models import F, Sum

class state(models.Model):
    name = models.CharField(max_length =50, null= True)

    def total_population(self):
        return self.county_set.aggregate(
            <b>pop=Sum('citypopulation__city1Popultaion')+F('citypopulation__city2Population'))</b>
        )['pop'] or 0

   def __str__(self):
       return self.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...