Python/Django Rest Framework помещает объекты с одинаковыми значениями в один список словарей
Я хочу поместить данные в один список словарей, если labelзначение объектов одинаково. Как в примере ниже:
dataPoints: [
{ x: new Date(2017,0), y: 1000, label:"Austria" },
{ x: new Date(2018,0), y: 1111, label:"Austria" },
{ x: new Date(2019,0), y: 2000,label:"Austria" },
{ x: new Date(2020,0), y: 1224,label:"Austria" },
{ x: new Date(2021,0), y: 4294,label:"Austria" },
]
Для этого я сделал примерно следующее:
class CustomBusinessIntelligenceList(generics.ListAPIView):
queryset = BusinessIntelligence.objects.all().order_by("-years__year")
serializer_class = BusinessIntelligenceSerializer
filter_backends = [DjangoFilterBackend]
filterset_class = CustomBusinessInteligenceFilter
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
dummy_response = []
mapping = {}
for count in range(0, len(queryset)):
dummy_response.extend([{"x": datetime.datetime(queryset[count].years.year, 1, 1), "y": queryset[count].amount, "label": queryset[count].countries.name}])
for d in dummy_response:
print(d)
return Response(dummy_response)
Это дало мне такой ответ. Который я не хочу видеть:
{
"x": "2014-01-01T00:00:00",
"y": "51717.5",
"label": "Austria"
},
Моей лучшей попыткой было следующее, но это не дало мне того ответа, который я хотел:
class CustomBusinessIntelligenceList(generics.ListAPIView):
queryset = BusinessIntelligence.objects.all().order_by("-years__year")
serializer_class = BusinessIntelligenceSerializer
filter_backends = [DjangoFilterBackend]
filterset_class = CustomBusinessInteligenceFilter
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
dummy_response = []
mapping = {}
for count in range(0, len(queryset)):
dummy_response.extend([{"x": datetime.datetime(queryset[count].years.year, 1, 1), "y": queryset[count].amount, "label": queryset[count].countries.name}])
for d in dummy_response:
try:
entry = mapping[d[
'label']] # raises KeyError:
entry['y'].append((d[
'y'])) # raises AttributeError:
entry['x'].append((d[
'x'])) # raises AttributeError:
except KeyError:
mapping[d[
'label']] = d
except AttributeError:
entry['y'] = [entry['y'], d[
'y']]
entry['x'] = [entry['x'], d[
'x']]
return Response(mapping.values())
Ответ:
{
"x": [
"2014-01-01T00:00:00",
"2012-01-01T00:00:00",
"2011-01-01T00:00:00",
"2002-01-01T00:00:00"
],
"y": [
"51717.5",
"4900.0",
"2.5",
"739.18049"
],
"label": "Austria"
},
Модель:
class BusinessIntelligence(models.Model):
# relations
countries = models.ForeignKey(
'core.Country', on_delete=models.CASCADE, related_name='countries_business_intelligence')
categories = models.ForeignKey('core.Category', on_delete=models.CASCADE,
related_name='categories_business_intelligence')
indicators = models.ForeignKey('core.Indicator', on_delete=models.CASCADE,
related_name='indicators_business_intelligence')
years = models.ForeignKey('core.Years', on_delete=models.CASCADE,
related_name='years_business_intelligence')
# informations
amount = models.CharField(max_length=255, null=True, blank=True)
rank = models.IntegerField(default=0)
# moderations
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return str(self.countries)
Serializer:
class BusinessIntelligenceSerializer(serializers.ModelSerializer):
years = serializers.StringRelatedField()
countries = CountrySerializer()
class Meta:
model = BusinessIntelligence
fields = '__all__'