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.
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__'
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.
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__'