【问题标题】:Passing Django query objects values() into Django Rest Framework Serializer将 Django 查询对象 values() 传递给 Django Rest Framework Serializer
【发布时间】:2020-06-16 11:28:47
【问题描述】:

我试图获得与我的 django 查询相同的输出,但是当 Django Rest Framework 提供服务时,实际输出会有所不同。在我的序列化程序中添加了以下内容,但它一直在输出中省略 cart_assessments__risk_type。如何使我的 django rest 框架序列化程序输出与我的 django 查询输出匹配?

models.py:

from django.db import models

class TrainAssessment(models.Model):
    train_name = models.CharField(max_length=30)


class CartAssessment(models.Model):
    train_assessment = models.ForeignKey(TrainAssessment, on_delete=models.CASCADE, related_name='cart_assessments')
    risk_type = models.CharField(max_length=30)

views.py

from rest_framework import viewsets, mixins

class SubwayTrainDetailsViewSet(viewsets.GenericViewSet,
                            mixins.ListModelMixin,
                            mixins.CreateModelMixin):
    queryset = TrainAssessment.objects.values('cart_assessments__risk_type').annotate(
        cart_count=Count('cart_assessments__risk_type')).order_by('-cart_count').annotate(
        train_count=Count('id', distinct=True))
    serializer_class = serializers.SubwayTrainDetailsViewSetSerializer

序列化器.py

from rest_framework import serializers

class SubwayTrainDetailsViewSetSerializer(serializers.ModelSerializer):
    train_count = serializers.IntegerField()
    cart_count = serializers.IntegerField()
    cart_assessments__risk_type = serializers.RelatedField(source="cartassessment.risk_type", read_only=True)

    class Meta:
        model = TrainAssessment
        fields = ('id', 'cart_assessments__risk_type', 'train_count', 'cart_count')

我试图让我的序列化程序提供与以下相同的输出:

#QUERY
queryset = TrainAssessment.objects.values('cart_assessments__risk_type').annotate(
    cart_count=Count('cart_assessments__risk_type')).order_by('-cart_count').annotate(
    train_count=Count('id', distinct=True))

#OUTPUT I WANT THAT COMES FROM ABOVE QUERY:
{'cart_assessments__risk_type': '', 'cart_count': 55, 'train_count': 14}
{'cart_assessments__risk_type': 'door', 'cart_count': 22, 'train_count': 13}
{'cart_assessments__risk_type': 'wheel', 'cart_count': 8, 'train_count': 8}
{'cart_assessments__risk_type': 'frame', 'cart_count': 1, 'train_count': 1}
{'cart_assessments__risk_type': 'floors', 'cart_count': 1, 'train_count': 1}
{'cart_assessments__risk_type': 'windows', 'cart_count': 1, 'train_count': 1}
{'cart_assessments__risk_type': 'straphanger', 'cart_count': 1, 'train_count': 1}

在点击 SubwayTrainDetailsViewSet 的端点/路线时,Django Rest Framework 缺少 cart_assessments__risk_type 的实际输出:

# OUTPUT MISSING `cart_assessments__risk_type`
[
    {"train_count": 14, "cart_count": 55},
    {"train_count": 13, "cart_count": 22},
    {"train_count": 8, "cart_count": 8},
    {"train_count": 1, "cart_count": 1},
    {"train_count": 1, "cart_count": 1},
    {"train_count": 1, "cart_count": 1},
    {"train_count": 1,"cart_count": 1}
]

django rest 框架如何使用cart_assessments__risk_type?p 提供输出服务?p

【问题讨论】:

  • 这个怎么样? cartassessment__risk_type = serializers.CharField(source='cartassessment__risk_type') ?
  • 您在关系名称的末尾丢失了s
  • @tarasinf 尝试在序列化程序“SubwayTrainDetailsViewSetSerializer”中的字段“CharField”上收到以下错误It is redundant to specify source='cartassessment__risk_type'`,因为它与字段名称相同。删除 source 关键字参数。`
  • @IvanStarostin 在RelatedField 的源代码中尝试使用s 时,它没有提到任何错误,但仍然没有在输出中显示cart_assessments__risk_type
  • @DanielPlasRivera 快速解决方案,通过序列化程序中的方法尝试,如def get_cart_assessments

标签: django python-3.x django-rest-framework django-3.0 drf-queryset


【解决方案1】:

谢谢@tarasinf。通过您提到的解决方案,我能够想出答案。

class SubwayTrainDetailsViewSetSerializer(serializers.ModelSerializer):
    train_count = serializers.IntegerField()
    cart_count = serializers.IntegerField()
    cart_assessments__risk_type = serializers.SerializerMethodField('get_cart_assessments')

    class Meta:
        model = TrainAssessment
        fields = ('cart_assessments__risk_type', 'train_count', 'cart_count')

    def get_cart_assessments(self, obj):
        return obj.get('cart_assessments__risk_type')

【讨论】:

    猜你喜欢
    • 2019-03-02
    • 1970-01-01
    • 2018-10-14
    • 2018-10-05
    • 2016-05-12
    • 1970-01-01
    • 2016-08-06
    • 2017-02-02
    • 2019-09-04
    相关资源
    最近更新 更多