Py学习  »  Django

带有外键的Django序列化程序不工作

yashdosi • 4 年前 • 826 次点击  

我想为我的模型创建一个ListCreateView。 这是模型-

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)

下面是模型的序列化程序-

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')

但当我在广告客户配置上执行get-on时,这不起作用。我在响应中没有得到配置名称。不会引发错误。

知道这里怎么了吗? 另外,我如何为广告客户配置创建一个?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38137
 
826 次点击  
文章 [ 2 ]  |  最新文章 4 年前
pfitzer
Reply   •   1 楼
pfitzer    5 年前

如果只需要配置的名称,可以使用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')

并按照ruddras提示重命名您的模型fk。

ruddra
Reply   •   2 楼
ruddra    5 年前

我不知道你为什么要用 PrimaryKeyRelatedField 在这里,您只需执行以下操作:

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

如果只需要一个带有配置名称的字段,则可以使用 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

另外,请考虑重命名您的模型的FK。因为当你用forignkey的时候 config ,django在db中创建一个名为的列 config_id 指向配置模型。