DRF create работает, только если для сериализатора установлено значение (many=True)

У меня проблема с представлением запроса POST.

DRF выдаст ошибку атрибута, если я не установлю сериализатор (AnswerSurveySerializer) в значение (many=True), но я просто хочу опубликовать одну запись для поля, которое является чужим.

Ценю любые советы и спасибо заранее.

models.py

class Survey(models.Model):

    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             related_name='surveys',
                             on_delete=models.CASCADE)
    is_completed = models.BooleanField(default=False)

    def __str__(self):
        return self.status


class Answer(models.Model):

    history = HistoricalRecords()
    survey = models.ForeignKey(
        Survey, related_name='answers', on_delete=models.CASCADE)
    choice = models.ForeignKey(
        Choice, related_name='answers', on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)

serializers.py

class AnswerSurveySerializer(serializers.ModelSerializer):

    class Meta:
        model = models.Survey
        fields = ('id',)


class AnswerSerializer(serializers.ModelSerializer):

    survey = AnswerSurveySerializer(many=True)

    class Meta:
        model = models.Answer
        fields = ('survey',)

views.py

class AddAnswerView(generics.CreateAPIView):
    """Handles creating answers to MCQ."""
    serializer_class = AnswerSerializer

1 ответ

Решение

Проблема заключается в вашем __str__ метод Survey модель. __str__ метод возвращает (пытается вернуть) атрибут status, но Survey класс модели не имеет status,

Так что удалите __str__ метод из модели или изменить на что-то значимое, как,

class Survey(models.Model):
    history = HistoricalRecords()
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             related_name='surveys',
                             on_delete=models.CASCADE)

    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

    is_completed = models.BooleanField(default=False)

    def __str__(self):
        return self.is_completed
Другие вопросы по тегам