【问题标题】:Django serializer not returning all fieldsDjango序列化程序不返回所有字段
【发布时间】:2017-02-05 13:08:49
【问题描述】:

我的序列化程序没有返回模型中的所有字段。只是嵌套的序列化程序。

serializer.py

class IndicatorSerializer(serializers.ModelSerializer):       
    class Meta:
        model = Indicator

class QuoteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Quote

class VWAPSerializer(serializers.ModelSerializer):
    vwap = serializers.SerializerMethodField()

    class Meta:
        model = Quote
        fields = ('date','open','high','low','close','vwap',)

    def get_vwap(self, obj):
        indicators = Indicator.objects.filter(quote__in = obj)
        return IndicatorSerializer(indicators,many=True).data

views.py

def get_vwap(request):
    """
    List all vwap for a date
    """
    quotes = Quote.objects.filter(date__gt = '2016-05-05')
    serializer = VWAPSerializer(quotes)
    return Response(serializer.data)

models.py

class Quote(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now_add=True)
    symbol = models.ForeignKey(Symbol, on_delete=models.CASCADE)
    date = models.DateField(blank=True, null=True)
    open = models.DecimalField(max_digits=15, decimal_places=2, null=True, blank=True)
    high = models.DecimalField(max_digits=15, decimal_places=2, null=True, blank=True)
    low = models.DecimalField(max_digits=15, decimal_places=2, null=True, blank=True)
    close = models.DecimalField(max_digits=15, decimal_places=2, null=True, blank=True)
    last = models.DecimalField(max_digits=15, decimal_places=2, null=True, blank=True)
    prevclose = models.DecimalField(max_digits=15, decimal_places=2, null=True, blank=True)
    tottrdqty = models.DecimalField(max_digits=15, decimal_places=2, null=True, blank=True)
    tottrdval = models.DecimalField(max_digits=15, decimal_places=2, null=True, blank=True)
    total_trades = models.DecimalField(max_digits=15, decimal_places=2, null=True, blank=True)

    class Meta:
        index_together = [
                ["symbol", "date"],
            ]

class Indicator(models.Model):
    quote = models.ForeignKey(Quote, on_delete=models.CASCADE)
    indicator = models.ForeignKey(IndicatorDefinition, on_delete=models.CASCADE, db_index=True)
    value = models.DecimalField(max_digits=15, decimal_places=2, null=True, blank=True)

    class Meta:
        unique_together = ('quote', 'indicator')

回应

"vwap": [
        {
            "id": 311743,
            "value": "1188.98",
            "quote": 77437,
            "indicator": 1
        },
        {
            "id": 311742,
            "value": "1185.52",
            "quote": 77437,
            "indicator": 2
        },

输出 ser = VWAPSerializer() 打印(repr(ser))

VWAPSerializer():
    date = DateField(allow_null=True, required=False)
    open = DecimalField(allow_null=True, decimal_places=2, max_digits=15, required=False)
    high = DecimalField(allow_null=True, decimal_places=2, max_digits=15, required=False)
    low = DecimalField(allow_null=True, decimal_places=2, max_digits=15, required=False)
    close = DecimalField(allow_null=True, decimal_places=2, max_digits=15, required=False)
    vwap = SerializerMethodField()

我不知道这是否有助于我在日志中看到这一点

VariableDoesNotExist: Failed lookup for key [name] in u'<RegexURLResolver <RegexURLPattern list> (admin:admin) ^admin/>'
[DEBUG 2017-02-05 18:59:47,163] base.py [:929] _resolve_lookup: Exception while resolving variable 'name' in template 'unknown'.
Traceback (most recent call last):
  File "/Users/avgeorge/trader/python/amrapali/venv/lib/python2.7/site-packages/django/template/base.py", line 907, in _resolve_lookup
    (bit, current))  # missing attribute
VariableDoesNotExist: Failed lookup for key [name] in u'<RegexURLResolver <RegexURLPattern list> (admin:admin) ^admin/>

我正在寻找的是一组给定的报价,以返回所有报价信息(根据模型)以及作为每个报价的嵌套列表的 VWAP 数据。我希望这是有道理的。我不确定自己做错了什么,如果有任何帮助,我将不胜感激。

【问题讨论】:

    标签: python django serialization


    【解决方案1】:

    您需要在您的IndicatorSerializer 中使用您的QuoteSerializer。见django-rest-frameworkdocumentation on nested relationships

    【讨论】:

    • 感谢 Raphael,我在 Quote 模型上使用 VWAPSerializer,因为我有 IndicatorSerializer。
    • 可以,但是你的VWAPSerializer只有一个字段可以返回IndicatorSerializer的返回值,而后者并没有对Quote做嵌套序列化。
    • 我想要的是带有嵌套 vwap 信息的引号列表,而不是带有嵌套引号的 vwap。抱歉,如果我的问题不清楚,我可以在必要时对其进行编辑。
    • 您只指定了fieldsvwap。您已排除所有其他字段
    • 谢谢,这也是我所做的,并且已经编辑了问题以显示它。我认为模型序列化程序默认自动包含所有字段。我现在已经明确添加了它们,但响应是一样的。我还编辑了问题以显示打印序列化程序的输出。
    猜你喜欢
    • 1970-01-01
    • 2019-01-17
    • 2019-10-26
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 2020-04-28
    相关资源
    最近更新 更多