DRF使用外键

时间:2017-04-21 05:47:03

标签: python django orm django-rest-framework

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选项是否更好地解决了我的特定问题?谢谢!

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'),
        )