Reputation: 1256
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
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
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