Django:根据其他外键获取外键的最大计数

时间:2018-08-30 19:53:48

标签: python django django-rest-framework

我有这个模特:

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

我是django和DRF的新手。我想在我的API Not Achieved中实现这样的结果 但这是我到目前为止Achieved

所取得的结果

您可以在图片中看到,我想计算每个位置的犯罪趋势(犯罪率最高的犯罪和犯罪本身)。

我的问题是:

  • 仅使用一个查询就可以甚至可以实现这些结果吗?
  • 如果是,怎么办?
  • 如果否,还有其他方法可以实现这种结果吗?

提前谢谢!

0 个答案:

没有答案