Как создать пользовательское поле списка при использовании Django Rest Framework

#django #python-3.x #serialization #django-rest-framework #django-serializer

#django #python-3.x #сериализация #django-rest-framework #django-сериализатор

Вопрос:

У меня есть следующая модель, и я хотел бы добавить пользовательское поле с именем choices , которое будет представлять собой список вариантов.

 class HPIQuestionBank(models.Model):
    label = models.CharField(
        max_length=200,
        db_index=True,
        blank=True,
        null=True)
    template = models.ForeignKey(
        HPIFilter, blank=True, null=True, on_delete=models.CASCADE, default='')
  

Я реализовал следующее в сериализаторах.

 class CheckBoxesListField(serializers.ListField):
    child = serializers.CharField(allow_null = True, allow_blank=True)

class TemplateQuestionBankSerializer(serializers.ModelSerializer):
    answer_type = serializers.CharField(allow_null = True, allow_blank=True)
    checkboxes = CheckBoxesListField()

    hpianswers_set =TemplateAnswerSerializer(many=True)
    class Meta:
        model = HPIQuestionBank
        fields = ['id','label','hpianswers_set','answer_type','checkboxes']
  

Я использую сериализатор в своем GET методе. Когда я пытаюсь сделать запрос, я получаю следующую ошибку:

 AttributeError at /api/clinic2/history/template/6/
Got AttributeError when attempting to get a value for field `checkboxes` on serializer `TemplateQuestionBankSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `HPIQuestionBank` instance.
Original exception text was: 'HPIQuestionBank' object has no attribute 'checkboxes'. 
  

Комментарии:

1. какова цель вашего checkboxes ? Только для получения данных?

2. Я хотел бы использовать его при создании метода PUT для обновления

Ответ №1:

Если вам нужно только прочитать данные, вы можете попробовать:

 class Meta:
    model = HPIQuestionBank
    fields = ['id','label','hpianswers_set','answer_type',]
    read_only_fields = ['checkboxes',]
  

Или вы можете работать с SerializerMethodField как

 class TemplateQuestionBankSerializer(serializers.ModelSerializer):
    answer_type = serializers.CharField(allow_null = True, allow_blank=True)
    checkboxes = SerializerMethodField()

    def get_checkboxes(self, instance):
        return CheckBoxesListField(instance).data
  

Комментарии:

1. Я получил следующую ошибку атрибута: объект ‘CheckBoxesListField’ не имеет атрибута ‘data’