社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

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

yashdosi • 5 年前 • 1643 次点击  

我想为我的模型创建一个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
 
1643 次点击  
文章 [ 2 ]  |  最新文章 5 年前
pfitzer
Reply   •   1 楼
pfitzer    6 年前

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

我不知道你为什么要用 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 指向配置模型。