Chickenfresh
Chickenfresh

Reputation: 365

Advanced serializing django models

I have these django models:

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)

and serializer:

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

in views:

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

    return Response(updates)

it represents data like this:

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

How can I represent data like this? :

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

Actually I could separate this model and use fields from details as manytomany but it doesnt let me create event using this:

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

Upvotes: 1

Views: 164

Answers (1)

JPG
JPG

Reputation: 88499

Re-define your serializers as below:

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')

and change view to

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

You could add text like

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

References:

  1. source in DRF Serializer
  2. DRF Nested Serializer

Upvotes: 1

Related Questions