DRF 使用外键更改 django 模型的字段名称值

Posted

技术标签:

【中文标题】DRF 使用外键更改 django 模型的字段名称值【英文标题】:DRF changing field name values of django models with foreign keys 【发布时间】:2017-09-17 23:45:03 【问题描述】:

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 选项是否被认为是解决我的特定问题的更好方法?谢谢!

【问题讨论】:

对于如何序列化相关字段的任何帮助,我将不胜感激,以供将来参考。 【参考方案1】:

您正在接收一个 json 对象,并添加它的键值。

 for vote_detail in data:
   if vote_detail.choiceTime__choice_date:
      vote_detail.choice_date=vote_detail.choiceTime__choice_date

然后序列化保存,快速解决。

您还可以在模型中添加您想要命名的名称。这更接近后端,也许值得深入研究。

【讨论】:

【参考方案2】:
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'),
        )

【讨论】:

以上是关于DRF 使用外键更改 django 模型的字段名称值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Jquery 更改按钮单击时的 django 外键对象文本选择字段?

如何在 DRF + django-rest-auth 中使用自定义用户模型保存注册时的额外字段

Django Rest DRF:从反向关系访问外键引用

(Django)如何在更改外键下拉列表后使“选定”选项有效?

如何在使用 AJAX、Django REST API 和 jQuery 以模式形式更新记录时显示外键字段名称而不是 ID

迁移 django-model 字段名称更改而不丢失数据