Django невозможно установить IntegerField на сериализаторе - PullRequest
0 голосов
/ 19 марта 2020

Я не профессиональный 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}, но я не могу понять его.

Может ли кто-нибудь помочь мне, пожалуйста, или дать мне подсказку, что я здесь делаю неправильно? Я был бы очень признателен.

Большое спасибо, я желаю вам sh замечательного дня!

1 Ответ

0 голосов
/ 25 марта 2020

Я решил проблему

Спасибо @Ivan Starostin за указание мне в правильном направлении.

Как:

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

ожидал MarketActionSerializer объект для атрибута marketaction, я по ошибке дал ему MarketActionSerializer.data.

Чтобы решить эту проблему, я проверил правильный формат маркера с помощью MarketActionSerializer(ma).is_valid(), но я использовал объект dict, ma, в экземпляре PrioritisedMarketActionSerializer.

Решение выглядит примерно так:

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

Спасибо всем за то, что вы помогли мне решить эту проблему и лучше понять Джано. Отдельное спасибо @Ivan Starostin.

...