Продвинутая сериализация моделей Django - PullRequest
0 голосов
/ 05 июля 2018

У меня есть эти модели Django:

class Event(models.Model):
    ts = models.CharField(max_length=25, editable=False)
    update_id = models.IntegerField( null=False)
    msg_id = models.CharField(max_length=50, primary_key=True, blank=True)
    chat = models.ForeignKey(Chat, on_delete=models.CASCADE, blank=True)
    user_id = models.ForeignKey(ChatUser, on_delete=models.CASCADE, blank=True)
    text = models.TextField(blank=True)
    is_visible = models.BooleanField(default=True, blank=True)
    edited_version = models.TextField(null=True, blank=True)

и сериализатор:

class UpdatesSerializer(serializers.ModelSerializer):
    class Meta:
        model = Event
        fields = ('ts', 'update_id', 'msg_id', 'chat', 'user_id', 'text')

просмотров:

def get(self, request):
    updates = Event.objects.all()
    updates = [UpdatesSerializer().to_representation(update) for update in updates]

    return Response(updates)

это представляет данные как это:

{
        "ts": 1,
        "update_id": 4,
        "msg_id": 1,
        "chat": 1,
        "user_id": 1,
        "text": "test"
    }

Как я могу представлять такие данные? :

{
        "ts": 1,
        "update_id": 4,
        "details":{
            "msg_id": 1,
            "chat": 1,
            "user_id": 1,
            "text": "test"
                  }
    }

На самом деле я мог бы отделить эту модель и использовать поля от деталей как можно больше, но это не позволило мне создать событие, используя это:

message_ = Event.objects.create(ts=int(time.time()), update_id=4)
message_.save()
message_.message.add(text="1")

1 Ответ

0 голосов
/ 06 июля 2018

Переопределите ваши сериализаторы, как показано ниже:

class DetailsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Event
        fields = ('msg_id', 'chat', 'user_id', 'text')


class EventSerializer(serializers.ModelSerializer):
    details = DetailsSerializer(source='*')

    class Meta:
        model = Event
        fields = ('ts', 'update_id', 'details')

и изменить view на

def get(self, request):
    event_queryset = Event.objects.all()
    event_serializer = EventSerializer(event_queryset, many=True)
    return Response(data = event_serializer.data)

Вы можете добавить text как

message_ = Event.objects.create(ts=int(time.time()), update_id=4)

<strike>message_.save()</strike> #  this save is not required because the ".create()" method calls the save() method silently
message_.text = "some text i want to update"
message_.save() # this time save is mandatory because we changed the value and we have to save it to DB

Ссылки

  1. source в сериализаторе DRF
  2. Вложенный сериализатор DRF
...