I followed suggestion from this question 但我需要将query_set的一个字段命名为另一个对象的日期字段
我的模特
class Choice(models.Model):
question = models.ForeignKey(Question, related_name='choice', on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
class ChoiceWithTime(models.Model):
choiceTime = models.ForeignKey(Choice,related_name='choiceTime', on_delete=models.CASCADE)
choice_date=models.DateField()
我的观点
class QuestionChoicesViewSet(viewsets.ModelViewSet):
queryset = Choice.objects.all()
serializer_class = ChoiceDateSerializer
def get_queryset(self):
return Choice.objects.values('choiceTime__choice_date','choice_text').annotate(
total_votes=Count('choiceTime__choice_date'),
)
我需要计算特定日期的提交数量
我不知道如何命名 choiceTime__choice_date 序列化程序识别查询集中的字段
class ChoiceDateSerializer(serializers.ModelSerializer):
choiceTime__choice_date = serializers.DateTimeField()
total_votes = serializers.IntegerField()
class Meta:
model = Choice
fields = ('id', 'choice_text','total_votes','choiceTime__choice_date')
我收到了
{
"choice_text": "ant tower",
"total_votes": 3,
"choiceTime__choice_date": "2017-04-20"
}
但我想收到
{
"choice_text": "ant tower",
"total_votes": 3,
"choice_date": "2017-04-20"
}
尝试了不同的选项却没有成功。当然,我错过了这一点。 为了我的目的,它是有效的,但我希望有一个编写良好的API。
2选项更改时间提交模型?
class ChoiceWithTime(models.Model):
choiceTime = models.ForeignKey(Choice,related_name='choiceTime', on_delete=models.CASCADE)
choice_date=models.DateField()
coutner = models.IntegerField(default=0)
2选项是否更好地解决了我的特定问题?谢谢!
答案 0 :(得分:1)
您正在接收一个json对象,您可以在其中添加其键值。
for vote_detail in data:
if vote_detail.choiceTime__choice_date:
vote_detail.choice_date=vote_detail.choiceTime__choice_date
然后序列化并保存,快速解决方案。
您还可以向模型添加要调用它的名称。这更接近后端,也许值得深入研究。
答案 1 :(得分:1)
from django.db.models import Count,F
如果有人发现这个问题,这是最简单的答案,我来了。 正如在使用模型包函数传递给序列化器更改值之前所建议的那样
class QuestionChoicesViewSet(viewsets.ModelViewSet):
queryset = Choice.objects.all()
serializer_class = ChoiceDateSerializer
def get_queryset(self):
return Choice.objects.all().annotate(choice_date=F('choiceTime__choice_date')).values('choice_date','choice_text').annotate(
total_votes=Count('choiceTime__choice_date'),
)