1

I'm new in using Django, I need your help

So, I created a model like this

models.py

from django.db import models

# Create your models here.
class Pegawai(models.Model):
    name = models.CharField(max_length=60)
    alias = models.CharField(max_length=60)
    def __str__(self):
        return self.name

class Barang(models.Model):
    pegawai = models.ForeignKey(Pegawai,on_delete=models.CASCADE,related_name='barangs',)
    nama_barang = models.CharField(max_length=60)
    harga_barang = models.CharField(max_length=60)
    def __str__(self):
        return self.pegawai.name

my serializer:

serializers.py

from rest_framework import serializers, fields

from .models import Pegawai,Barang


class BarangSerializer(serializers.ModelSerializer):
    class Meta:
        model = Barang
        fields = (
                'pegawai', 
                'nama_barang',
                'harga_barang',
                )

class PegawaiSerializer(serializers.ModelSerializer):
    barangs = BarangSerializer(read_only=True, many=True)
    class Meta:
        model = Pegawai
        fields = (
                'id',
                'name', 
                'alias',
                'barangs',
                )

my views:

views.py

from rest_framework import viewsets

from .serializers import PegawaiSerializer,BarangSerializer
from .models import Pegawai,Barang

class BarangViewSet(viewsets.ModelViewSet):
    queryset = Barang.objects.all().order_by('nama_barang')
    serializer_class = BarangSerializer

class PegawaiViewSet(viewsets.ModelViewSet):
    queryset = Pegawai.objects.all().order_by('name')
    serializer_class = PegawaiSerializer

Results:

{
    "id": 5,
    "name": "Ryan",
    "alias": "R",
    "barangs": [
        {
            "pegawai": 5,
            "nama_barang": "burjo",
            "harga_barang": "1234"
        },

Question: how can i change pegawai fields from id to name? like this:

{
    "id": 5,
    "name": "Ryan",
    "alias": "R",
    "barangs": [
        {
            "pegawai": Ryan,
            "nama_barang": "burjo",
            "harga_barang": "1234"
        },

I've searched some solutions but nothing works, I don't know where the problem is, so I need your guide. Cheers.

0

3 Answers 3

2

use serializers.CharField.

class BarangSerializer(serializers.ModelSerializer):
    pegawali=serializers.CharField(source="pegawali.name")
    class Meta:
        model = Barang
        fields = (
            'pegawai', 
            'nama_barang',
            'harga_barang',
            )
Sign up to request clarification or add additional context in comments.

Comments

1

Method-1

Since you are defined __str__() method in your Pegawai model, you can use StringRelatedField(...)

class BarangSerializer(serializers.ModelSerializer):
    pegawai = serializers.StringRelatedField()

    class Meta:
        model = Barang
        fields = (
            'pegawai',
            'nama_barang',
            'harga_barang',
        )

Method-2

use CharField

class BarangSerializer(serializers.ModelSerializer):
    pegawai = serializers.CharField(source='pegawai.name')

    class Meta:
        model = Barang
        fields = (
            'pegawai',
            'nama_barang',
            'harga_barang',
        )

UPDATE-1

To solve issues while creation of model objects, override the to_representation() method

class BarangSerializer(serializers.ModelSerializer):
    class Meta:
        model = Barang
        fields = (
            'pegawai',
            'nama_barang',
            'harga_barang',
        )

    def to_representation(self, instance):
        rep = super().to_representation(instance)
        rep['pegawai'] = instance.pegawai.name
        return rep

4 Comments

This one is works.. but when i tried to input into Barang, i got errors like this: AssertionError: The .create() method does not support writable dotted-source fields by default. Write an explicit .create() method for serializer myapi.serializers.BarangSerializer, or set read_only=True on dotted-source serializer fields. Solution?
but how if I want to get all the Pegawai into the BarangSerializer?
Since your issue mentioned in the original post has been resolved, you should ask a new question.
0

You can change the fields value in serializer with DRF RelatedField:

class BarangSerializer(serializers.ModelSerializer):
    pegawai = serializers.RelatedField(source='pegawai.name', read_only=True)
    class Meta:
        model = Barang
        fields = (
                'pegawai', 
                'nama_barang',
                'harga_barang',
                )

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.