How to return object insted of id's, and auto create foreingKey object (get python with django)

Question:

I’m creating a simple rest api

This is my actual result from devices

[
    {
        "id_device": "a099d2ce-812b-4d85-8c8b-cfe71057fbe7",
        "name": "Interruptor 4",
        "identifier": "teste1",
        "group": "39407ef6-1a3e-4965-9b61-96f6c40b76b3",
        "options": [
            "1b383a37-5229-4ae0-9649-f76aa32eeda0",
            "4ff5406a-8c7b-4517-9ec0-14fd4f68f30b",
            "a541216d-f509-4461-85ca-444491ac9217",
            "3debe828-edd6-4d83-bfd8-2776a1594380"
        ]
    },
    {
        "id_device": "dc9f672f-6759-4b1f-ac65-e3d78e09833d",
        "name": "teste",
        "identifier": "teste",
        "group": "39407ef6-1a3e-4965-9b61-96f6c40b76b3",
        "options": [
            "a76c54cf-b11a-4a5e-986b-3e38a86568cd",
            "ef736b76-4bac-42f1-9393-c01e18787108",
            "84e6c598-072f-4bb8-90e9-34019547534f"
        ]
    }
]

my models.py

from uuid import uuid4
from django.db import models

class Options(models.Model):
    id_option = models.UUIDField(primary_key=True, default=uuid4, editable=False)
    name = models.CharField(max_length=255)
    identifier = models.CharField(max_length=255)

    class Meta:
        ordering = ['name']

    def __str__(self):
        return self.name


class Groups(models.Model):
    id_group = models.UUIDField(primary_key=True, default=uuid4, editable=False)
    name = models.CharField(max_length=255)

    class Meta:
        ordering = ['name']

    def __str__(self):
        return self.name

class Devices(models.Model):
    id_device = models.UUIDField(primary_key=True, default=uuid4, editable=False)
    name = models.CharField(max_length=255)
    identifier = models.CharField(max_length=255)
    options = models.ManyToManyField(Options)
    group = models.ForeignKey(Groups, on_delete=models.CASCADE, default="")

viewsets

from rest_framework import viewsets
from devices.api import serializers
from devices import models

class DevicesViewsets(viewsets.ModelViewSet):
    serializer_class = serializers.DevicesSerializer
    queryset = models.Devices.objects.all()
    
class OptionsViewsets(viewsets.ModelViewSet):
    serializer_class = serializers.OptionsSerializer
    queryset = models.Options.objects.all()

class GroupsViewsets(viewsets.ModelViewSet):
    serializer_class = serializers.GroupsSerializer
    queryset = models.Groups.objects.all()

serializers

from rest_framework import serializers
from devices import models

class DevicesSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Devices
        fields = '__all__'

class OptionsSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Options
        fields = '__all__'

class GroupsSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Groups
        fields = '__all__'

I try some solutions from internet but none with success, so can someone help me get a result like this?

{
        "id_device": "a099d2ce-812b-4d85-8c8b-cfe71057fbe7",
        "name": "Interruptor 4",
        "identifier": "teste1",
        "group": {
            "id": "39407ef6-1a3e-4965-9b61-96f6c40b76b3",
            "name": "testeGroupName"
        },
        "options": [
            {
              "id": "1b383a37-5229-4ae0-9649-f76aa32eeda0",
              "name": "nameOption",
              "identifier": "teste55"
            }
            ....
        ]
}

another thing is on post (create the device), i need to have the options and groups previously created, there is any wait to create on the request the foreingkeys? i realy just need that in options

Sory for the bad apresentation of the problem, i’m try my best.

Asked By: Ricardo

||

Answers:

You can use nested serializer:

from rest_framework import serializers
from devices import models


class OptionsSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Options
        fields = '__all__'


class GroupsSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Groups
        fields = '__all__'


class DevicesSerializer(serializers.ModelSerializer):
    group = GroupsSerializer()
    options = OptionsSerializer(many=True)

    class Meta:
        model = models.Devices
        fields = '__all__'

Answered By: Amin