Вернуть буквенный JSON вместо __str__ Django Rest Framework - PullRequest
0 голосов
/ 09 июля 2019

Всякий раз, когда я объявляю Абстрактную модель в Django для учета вложенных моделей, Django просит меня объявить str как строковое представление этой Модели. Приложение, которое я пишу, должно быть API, возвращающим JSON, и вместо реального объекта Django возвращает то, что я определил как str .

Пример:

Моя модель:

class SomeModel(models.Model):
  a = models.CharField()
  b = models.CharField()

  def __str__(self):
    return 'some string'

  class Meta:
    abstract = True

Родительская модель:

class ParentModel(models.Model):
  someModel = models.EmbeddedModelField(
    model_container=SomeModel
  )

Serializer:

class ParentSerializer(serializers.ModelSerializer):
  class Meta:
    model = ParentModel
    fields = ('someModel')

Вид:

class ParentViewSet(viewsets.ModelViewSet):
  queryset = ParentModel.objects.all()
  serializer_class = ParentSerializer

Теперь, когда я отправляю объект ParentModel, я хотел бы отправить что-то вроде этого: { someModel: { a: 'something', b: 'something else' } }, а не то, что определено в __str__. Я понимаю, что я мог бы определить метод __str__ для возврата всех его полей в виде строки, а затем поставить фигурные скобки вокруг вывода также в виде строк, но должен быть лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Попробуйте изменить код, как показано ниже

class ParentModel(models.Model):
  someModel = models.EmbeddedModelField(
    model_container=SomeModel
  )

  def __str__(self):
      return "{}".format(self.someModel)

0 голосов
/ 09 июля 2019

Поскольку SomeModel является абстрактной моделью, DRF не позволяет вам создавать сериализатор для этой модели. Вы можете сослаться на этот ответ , где создается пользовательский сериализатор для абстрактной модели.

Если класс SomeModel не является абстрактным, вам необходимо создать сериализатор для вашего класса SomeModel и использовать его в своем классе ParentSerializer как записываемый вложенный сериализатор. Итак, примерно, вам нужно реализовать что-то вроде этого:

# serializers.py
class SomeModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = SomeModel
        fields = ('some_fields')

class ParentSerializer(serializers.ModelSerializer):
    someModel = SomeModelSerializer()
    class Meta:
        model = ParentModel
        fields = ('someModel')

Более подробную информацию о записываемых вложенных сериализаторах можно найти по здесь .

...