我不是专业的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}值,但我无法弄清楚。
有人可以帮我,或者给我提示我在这里做错了什么吗?我将不胜感激。
非常感谢,祝您有美好的一天!
我已经解决了问题
感谢@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。