Django无法在序列化程序上设置IntegerField

问题描述 投票:0回答:1

我不是专业的Django用户,我会尽力简洁地描述此问题。

我有一个Django序列化程序定义:

class PrioritisedMarketActionSerializer(serializers.Serializer):
   marketaction = MarketActionSerializer(required=True)
   priority = serializers.IntegerField()

并且MarketActionSerializer的定义是

class MarketActionClearingSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(required=True)

class Meta:
    model = MarketAction

    fields = (
        'id', 'date', 'actionStartTime', 'actionEndTime', 'value', 'uom', 'price', 'deliveryPoint',
        'marketSessionid',
        'marketActorid', 'formid', 'actionTypeid', 'statusid', 'loadid', 'cpu', 'ram', 'disk',)
    depth = 0
    error_status_codes = {
        HTTP_400_BAD_REQUEST: 'Bad Request',
        HTTP_201_CREATED: 'Created',
        HTTP_204_NO_CONTENT: 'No content',
        HTTP_301_MOVED_PERMANENTLY: 'Moved permanently',
        HTTP_401_UNAUTHORIZED: 'Unauthorized',
        HTTP_403_FORBIDDEN: 'Forbidden',
        HTTP_404_NOT_FOUND: 'Not found',
        HTTP_500_INTERNAL_SERVER_ERROR: 'Internal server error'
    }

我的目标是创建这些序列化程序对象的列表,在通过POST方法接收到MarketAction对象的列表之后。我声明一个空列表来存储这些对象:

output = []

然后,遍历接收到的对象:

prioritised_ma["marketaction"] = MarketActionSerializer(ma).data
prioritised_ma["priority"] = 1


output.append(PrioritisedMarketActionsSerializer(prioritised_ma).data)

[[priority]]字段设置为1,{int},用于测试。但是,当我打电话时:

PrioritisedMarketActionsSerializer(prioritised_ma).data

我收到这个奇怪的错误:

'int' object has no attribute 'pk'

完整的关联堆栈跟踪为:

Traceback (most recent call last):
  File "/home/vlad/Documents/Research Projects/Catalyst Marketplace/GitProjects/orchestrator/information_broker/ib/views/api.py", line 709, in post
  output.append(PrioritisedMarketSerializer(prioritised_ma_clearing).data)
  File "/home/vlad/.local/lib/python3.6/site-packages/rest_framework/serializers.py", line 563, in data
    ret = super(Serializer, self).data
  File "/home/vlad/.local/lib/python3.6/site-packages/rest_framework/serializers.py", line 262, in data
    self._data = self.to_representation(self.instance)
  File "/home/vlad/.local/lib/python3.6/site-packages/rest_framework/serializers.py", line 530, in to_representation
    ret[field.field_name] = field.to_representation(attribute)
  File "/home/vlad/.local/lib/python3.6/site-packages/rest_framework/serializers.py", line 530, in to_representation
    ret[field.field_name] = field.to_representation(attribute)
  File "/home/vlad/.local/lib/python3.6/site-packages/rest_framework/relations.py", line 272, in to_representation
    return value.pk
AttributeError: 'int' object has no attribute 'pk'

我假设错误与“优先级”字段相关,该字段是{int}值,但我无法弄清楚。

有人可以帮我,或者给我提示我在这里做错了什么吗?我将不胜感激。

非常感谢,祝您有美好的一天!

django django-rest-framework serializer
1个回答
0
投票

我已经解决了问题

感谢@Ivan Starostin为我指出了正确的方向。

作为:

class PrioritisedMarketActionSerializer(serializers.Serializer):
    marketaction = MarketActionSerializer(required=True)
    priority = serializers.IntegerField()

MarketActionSerializer属性预期为marketaction对象,我错误地给了它MarketActionSerializer.data

为了解决该问题,我已经使用MarketActionSerializer(ma).is_valid()检查了正确的行情格式,但在实例化ma时使用了dict对象PrioritisedMarketActionSerializer

解决方案类似于以下内容:

if MarketActionSerializer(data=ma).is_valid():
    prioritised_ma["marketaction"] = ma
    prioritised_ma["priority"] = 1
    prioritised_marke_action = PrioritisedMarketActionSeializer(prioritised_ma).data

谢谢大家指导我解决这个问题,并更好地了解Djano。特别感谢@Ivan Starostin。

© www.soinside.com 2019 - 2024. All rights reserved.