Django: получить максимальное количество внешнего ключа на основе другого внешнего ключа - PullRequest
0 голосов
/ 30 августа 2018

У меня есть эта модель:

class Complaint(models.Model):
    user            = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, default=1)
    date_created    = models.DateTimeField(auto_now_add=True, null=True, blank=True)
    name            = models.CharField(max_length=255, unique=True)
    definition      = models.TextField(blank=False, default="")
    is_violent      = models.BooleanField(default=False)
    is_active       = models.BooleanField(default=True)

    def __str__(self):
        return self.name
    class Meta:
        ordering = ['name']

    def get_absolute_url(self):
        return reverse('complaint-details', kwargs={'pk': self.pk})

    class Service(models.Model):
    user            = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, default=1)
    date_created    = models.DateTimeField(auto_now_add=True, null=True, blank=True)
    name            = models.CharField(max_length=255, unique=True)
    definition      = models.TextField(blank=True, default="")
    is_active       = models.BooleanField(default=True)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('service-details', kwargs={'pk': self.pk})


class Location(models.Model):
    user            = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, default=1)
    date_created    = models.DateTimeField(auto_now_add=True, null=True, blank=True)
    location_name   = models.CharField(max_length=255, unique=True)
    loc_lat         = models.DecimalField(max_digits=9, decimal_places=6)
    loc_long        = models.DecimalField(max_digits=9, decimal_places=6)
    pop             = models.PositiveIntegerField(default=500)
    is_AOR          = models.BooleanField(default=False)
    is_active       = models.BooleanField(default=True)

    def __str__(self):
        return self.location_name

class Blotter(models.Model):
    user            = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, default=1)
    date_created    = models.DateTimeField(auto_now_add=True, null=True, blank=True)#default=timezone.now().date()
    date            = models.DateField(blank=True)
    time            = models.TimeField(blank=True)
    entry_number    = models.CharField(max_length=255, unique=True,validators=[RegexValidator(r'^\d{1,255}$')])
    complaints      = models.ForeignKey(Complaint, on_delete=models.CASCADE, null=True, blank=True)
    service         = models.ForeignKey(Service, on_delete=models.CASCADE, null=True, blank=True)
    information     = models.TextField(blank=False, default="")
    location        = models.ForeignKey(Location, on_delete=models.CASCADE, null=True, blank=True)
    is_active       = models.BooleanField(default=True)

    class Meta:
        ordering = ("date_created",)
    def __str__(self):
        return (self.entry_number)

    def get_absolute_url(self):
        return reverse('details-blotter', kwargs={'pk': self.pk})

И у меня есть этот сериализатор:

class APILocationListSerializer(serializers.Serializer):
address = serializers.CharField()
latitude = serializers.DecimalField(max_digits=9, decimal_places=5)
longitude = serializers.DecimalField(max_digits=9, decimal_places=5)
population= serializers.IntegerField()
crime_count=serializers.IntegerField()
crime_rate=serializers.DecimalField(max_digits=4, decimal_places=3)
is_aor = serializers.BooleanField()

class Meta:
    model = Blotter
    fields= [
        'address',
        'latitude',
        'longitude',
        'population',
        'crime_count',
        'crime_rate'
        'is_aor',
    ]

def to_representation(self, value):
    context = {
        value['address']:
        {
        'coordinates':[value['latitude'],value['longitude']],
        'Population': value['population'],
        'Crime-Count': value['crime_count'],
        'Crime-Rate': value['crime_rate'],
        'Area-Of-Responsibility': value['is_aor'],
        }
    }
    return context

И ListApiView:

class APILocationList(generics.ListAPIView):
serializer_class = APILocationListSerializer
def get_queryset(self):
    q=Blotter.objects.values('location__location_name').annotate(
        address=F('location__location_name'),
        latitude=F('location__loc_lat'),
        longitude=F('location__loc_long'),
        population=F('location__pop'),
        crime_count=Count('complaints', filter=Q(complaints__is_active=True) and Q(complaints__isnull=False)),
        crime_rate=(Cast(F('crime_count'), FloatField())/Cast(F('population'), FloatField()))*100000,
        is_aor=F('location__is_AOR')
        )
    q1 = q.filter(location__is_AOR=True).order_by('address')
    query_search        = self.request.GET.get("q")

    if query_search:
        q1 = q.filter(Q(location__is_AOR=True) and Q(location__location_name__icontains=query_search)).order_by('address')
    return q1

Я новичок в Джанго и ДРФ. Я хочу добиться такого результата в своем API Not Ach достижим но это результат, которого я достиг до сих пор Выполнено

Как вы можете видеть на картинке, я хочу подсчитать тенденцию преступности (наибольшее количество преступлений и само преступление) в каждой локации.

Мои вопросы:

  • Это даже достижимо / возможно, чтобы получить эти результаты, используя только один запрос?
  • Если да, то как?
  • Если нет, есть ли другой способ достижения такого рода результатов?

Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...