Santhosh
Santhosh

Reputation: 11788

django rest framework:In Serializer how to show the field properties also

I have model:

class Ingredient(models.Model):
    KILOGRAM = 'kg'
    LITER = 'ltr'
    PIECES = 'pcs'
    MUNITS_CHOICES = (
        (KILOGRAM, 'Kilogram'),
        (LITER, 'Liter'),
        (PIECES, 'Pieces'),
    )

    name = models.CharField(max_length=200,unique=True,null=False)
    slug = models.SlugField(unique=True)
    munit = models.CharField(max_length=10,choices=MUNITS_CHOICES,default=KILOGRAM)
    rate = models.DecimalField(max_digits=19, decimal_places=2,validators=[MinValueValidator(0)],default=0)
    typeofingredient = models.ForeignKey(TypeOfIngredient, related_name='typeof_ingredient',null=True, blank=True,on_delete=models.PROTECT)
    density_kg_per_lt = models.DecimalField(max_digits=19, decimal_places=2,verbose_name='Density (kg/lt)',null=True,blank=True,validators=[MinValueValidator(0)])
    density_pcs_per_kg = models.DecimalField(max_digits=19, decimal_places=2,verbose_name='Density (pcs/kg)',null=True,blank=True,validators=[MinValueValidator(0)])
    density_pcs_per_lt = models.DecimalField(max_digits=19, decimal_places=2,verbose_name='Density (pcs/lt)',null=True,blank=True,validators=[MinValueValidator(0)])
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)

When i get the api i also want to get field types like char, decimal, datetime etc

Something like the below api result, is it possible. Because i am using reactJs as frontend, i have tell the input what kind of field it can accept and also helps in sorting by text or number

{
      "id": {value: 1,type: number},
      "name": {value: "adark",type: charfield},
      "rate": {value: "12.00",type: decimal},
      "updated": {value: "2017-07-14T10:51:47.847171Z",type: datetime},
     .......so on
}

Upvotes: 1

Views: 861

Answers (1)

Maulik Patel
Maulik Patel

Reputation: 572

The Corresponding Serializer would be as follows:

class IngredientSerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField()
    rate = serializers.SerializerMethodField()
    updated = serializers.SerializerMethodField()

    class Meta:
        model = Ingredient
        fields = ('name', 'rate', 'updated')

    def get_name(self, obj):
        response = dict()
        response['value'] = obj.name
        response['type'] =  obj.name.get_internal_type()
        return Response(response)

    def get_rate(self, obj):
        response = dict()
        response['value'] = obj.rate
        response['type'] =  obj.rate.get_internal_type()
        return Response(response)

    def get_updated(self, obj):
        response = dict()
        response['value'] = obj.updated
        response['type'] =  obj.updated.get_internal_type()
        return Response(response)

Upvotes: 1

Related Questions