투표 결과를 도출하자. 나이대별로 투표 항목별 표 개수를 반환하는 것이 목표이다.
투표는 Vote모델이며 투표항목은 3개로 고정되어 있다.
한 사용자가 투표를 하면 VotePer모델의 객체가 생성된다. VotePer모델은 다음과 같다.
class VotePer(models.Model):
voteper_id=models.AutoField(primary_key=True)
age=models.IntegerField() # 1,2,3,4,5
select=models.IntegerField() # 1,2,3
voteper_vote=models.ForeignKey(Vote, related_name='voteper_vote',on_delete=models.CASCADE)
voteper_user=models.ForeignKey(User, related_name='voteper_user',on_delete=models.CASCADE)
serializers.py
class DoneVotePostSerializer(serializers.ModelSerializer):
vote_user=UserProfileSerializer()
result=serializers.SerializerMethodField()
class Meta:
model = Vote
fields=['vote_id','title','item1', 'item2', 'item3', 'start_date','done_date','vote_user','result']
def get_result(self, instance):
result = {} # 결과를 저장할 딕셔너리
for age, _ in VotePer.AGES:
for select, _ in VotePer.SELECTS:
result[f"result{select}_{age}"] = VotePer.objects.filter(voteper_vote=instance, age=age, select=select).count()
return result
결과:
"DoneVote": [
{
"vote_id": 21,
"title": "투표제목",
"item1": "[투표항목1]",
"item2": "[투표항목2]",
"item3": "[투표항목3]",
"start_date": "2023-05-01",
"done_date": "2023-05-10",
"vote_user": {
"id": 4,
"profile" : "[이미지url]",
"nickname": "도라에몽"
},
"result":{ # 투표 결과
"result1_10": 1, # 첫번째 항목 선택한 10대 수
"result1_20": 0, # 첫번째 항목 선택한 20대 수
"result1_30": 0,
"result1_40": 1,
"result1_50": 1,
"result2_10": 9, # 두번째 항목 선택한 10대 수
"result2_20": 2,
"result2_30": 0,
"result2_40": 3,
"result2_50": 4,
"result3_10": 5,
"result3_20": 3,
"result3_30": 2,
"result3_40": 1,
"result3_50": 1,
}
}
