@HeyAway

DRF. Как изменить вид вывода данных из модели?

Прошу прощения. Вопрос, возможно, задан некорректно.

Грубо говоря, сейчас на старом api имею подобный выхлоп:
{
	"response": {
		"status": "success",
		"code": 200,
		"data": [{
			"category": "str",
			"last_changed_str": "1521989932",
			"created_str": "1521989932",
			"title": "str",
			"text": "str",
			"image": "str",
			"last_changed": 1521989932,
			"uniq_id": "str",
			"created": 1521989932,
			"link": "https://",
			"id": 96,
			"tags": ["str", "str"]
		}, {
			"category": "str",
			"last_changed_str": "1521989932",
			"created_str": "1521989932",
			"title": "str",
			"text": "str",
			"image": "str",
			"last_changed": 1521989932,
			"uniq_id": "str",
			"created": 1521989932,
			"link": "https://",
			"id": 96,
			"tags": ["str", "str"]
		}]
	}
}


Т.е, есть общий "response" и вложенный в него "data". Статус и код - фиг с этим. Разберусь, но вот в этой вложенности совсем запутался. На django только начал переходить.

А вот, что выплевывает django на данный момент:

[
    {
		"category": "str",
		"last_changed_str": "1521989932",
		"created_str": "1521989932",
		"title": "str",
		"text": "str",
		"image": "str",
		"last_changed": 1521989932,
		"uniq_id": "str",
		"created": 1521989932,
		"link": "https://",
		"id": 96,
		"tags": ["str", "str"]
    },
    {
		"category": "str",
		"last_changed_str": "1521989932",
		"created_str": "1521989932",
		"title": "str",
		"text": "str",
		"image": "str",
		"last_changed": 1521989932,
		"uniq_id": "str",
		"created": 1521989932,
		"link": "https://",
		"id": 96,
		"tags": ["str", "str"]
    }
]


Поиском пользовался. Было решение через to_representation и работает оно, как надо. За одним исключением: этим самые response и data добавляются к каждой "новости". Т.е, он не общий для всех.

Код самый дефолтный:

views.py
class NewsViewSet(viewsets.ModelViewSet):
    queryset = News.objects.all().order_by('-created')
    serializer_class = NewsSerializer


models.py
class News(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=255)
    text = models.TextField(unique=False, default=False)
    link = models.URLField(max_length=200, blank=False)

    CATEGORY_CHOICES = (('22', '22'), ('33', '33'), ('44', '55'))
    category = models.CharField(max_length = 128, choices = CATEGORY_CHOICES)

    tags = ArrayField(models.CharField(max_length=255), blank=True)
    image = models.CharField(max_length=255, unique=False, default=False)
    created = models.IntegerField(default=time.time(), editable=False)
    last_changed = models.IntegerField(default=time.time(), editable=False)
    uniq_id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)


serializers.py
class NewsSerializer(serializers.ModelSerializer):
    author_name = serializers.CharField(source='author.username', read_only=True)
    created = serializers.IntegerField(read_only=True)

    class Meta:
        model = News
        fields = ('author', 'author_name', 'text', 'link', 'category', 'tags', 'image', 'created', 'last_changed', 'uniq_id')


Такая простая ерунда, а что-то знатно встрял. Спасибо!
  • Вопрос задан
  • 641 просмотр
Пригласить эксперта
Ответы на вопрос 1
@iegor
Когда в сериализер передается параметр many=True, используется ListSerializer, а оригинальный сериализер становится элементом ListSerializer. Его можно переопределить в Meta (list_serializer_class). У него можно переопределить метод to_representation и возможно data. Но проще во View переопределить get: response.data = {'result': response.data}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы