yashdosi
yashdosi

Reputation: 1256

Django Serializers with Foreign Key not working

I want to create a ListCreateView for my models. Here is are models -

from django.db import models

from training_service.models.advertiser import Advertiser

class Config(models.Model):
    CONFIG_TYPE_CHOICES = (
        ('DATA_DESCRIPTOR', 'DATA_DESCRIPTOR'),
        ('DATAFETCH', 'DATAFETCH'),
        ('BATCHSYSTEM', 'BATCHSYSTEM'),
        ('SPARKSYSTEM', 'SPARKSYSTEM')
    )

    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100)
    config_type = models.CharField(max_length=100,
                                   choices=CONFIG_TYPE_CHOICES,
                                   blank=False)
    default_value = models.CharField(max_length=1000)

    class Meta:
        db_table = 'config'

    def __unicode__(self):
        return str(self.name)

class AdvertiserConfig(models.Model):
    advertiser_id = models.ForeignKey(
        Advertiser, to_field="advertiser_id", db_column="advertiser_id", on_delete=models.DO_NOTHING)
    config_id = models.ForeignKey(Config, on_delete=models.CASCADE)
    value = models.CharField(max_length=1000)

    class Meta:
        db_table = 'advertiser_config'

    def __unicode__(self):
        return str(self.name)

Below are the serializers for the models -

class ConfigSerializer(serializers.ModelSerializer):
    class Meta:
        model = Config
        fields = ('name', 'config_type', 'value_type', 'default_value')

class AdvertiserConfigSerializer(serializers.ModelSerializer):
    config_name = serializers.PrimaryKeyRelatedField(read_only=True, many=True)
    class Meta:
        model = AdvertiserConfig
        fields = ('advertiser_id', 'config_name', 'value')

But this is not working when I do a get on AdvertiserConfig I am not getting config_name in the response. And no error is thrown.

Any idea what is wrong here? Also how would I do a create for AdvertiserConfig?

Upvotes: 0

Views: 693

Answers (2)

pfitzer
pfitzer

Reputation: 86

If you just want the name of the config, you can user SlugRelatedField

class AdvertiserConfigSerializer(serializers.ModelSerializer):
config = serializers.SlugRelatedField(slug_field='name', read_only=True, many=True)
class Meta:
    model = AdvertiserConfig
    fields = ('advertiser_id', 'config', 'value')

And follow ruddras hint to rename your models FK.

Upvotes: 0

ruddra
ruddra

Reputation: 51948

I don't know why you need to use PrimaryKeyRelatedField here, you can simply do this:

class AdvertiserConfigSerializer(serializers.ModelSerializer):
    class Meta:
        model = AdvertiserConfig
        fields = ('advertiser_id', 'config_id', 'value')

If you just want a field with config_name, then you can use SerializerMethodField:

class AdvertiserConfigSerializer(serializers.ModelSerializer):
    config_name = serializers.SerializerMethodField()
    class Meta:
        model = AdvertiserConfig
        fields = ('advertiser_id', 'config_name', 'value')

    def get_config_name(self, obj):
         return obj.config_id.name  # will return config_id's name

Also, please consider renaming your model's FK. Because when you use ForignKey with name config, django creates a column in DB with name config_id which points to Config Model.

Upvotes: 1

Related Questions