【问题标题】:django rest framework serializers giving "serializers.Language.None"django rest 框架序列化程序给出“serializers.Language.None”
【发布时间】:2018-10-03 05:11:57
【问题描述】:

这是我的 serializers.py

class GetCompanySerializer(serializers.ModelSerializer):
    language = serializers.CharField()
    class Meta:
        model = Company
        fields = ('company_name','started_from','country','email','website','ip','active','language')

这是我的意见.py

class CompanyView(viewsets.ModelViewSet):
queryset =  Company.objects.all()
serializer_class = CompanySerializer

def get_serializer_class(self):
    serializer_class = self.serializer_class
    if self.request.method == 'GET':
        serializer_class = GetCompanySerializer
    return serializer_class

这是我的models.py

class Company(models.Model):
    company_id   = models.BigAutoField(primary_key=True)
    company_name = models.CharField(max_length=255)
    started_from = models.DateTimeField(auto_now=True)
    country      = models.CharField(max_length=255)
    email        = models.EmailField(max_length=254)
    website      = models.URLField()
    ip           = models.GenericIPAddressField(default=get_ip(),null=True,blank=True)
    active       = models.BooleanField(default=True)

    def __str__(self):
        return self.company_name

class Language(models.Model):
    language_id     = models.BigAutoField(primary_key=True)
    language_name   = models.CharField(max_length=255)
    language_logo   = models.FileField()
    created_on      = models.DateTimeField(auto_now=True)
    latest_build_on = models.DateTimeField(auto_now_add=True)
    latest_version  = models.DecimalField(max_digits=5, decimal_places=2)
    company         = models.ForeignKey('Company',on_delete=models.CASCADE,related_name='language')

    def __str__(self):
        return self.language_name

提供api:

[
    {
        "company_name": "Guido van dom rossum",
        "started_from": "2018-10-03T04:58:54.889132Z",
        "country": "Netherland",
        "email": "help@python.com",
        "website": "https://python.org",
        "ip": "127.0.0.1",
        "active": true,
        "language": "serializers.Language.None"
    }
]

它应该给出它给出的语言字段位的语言名称“serializers.Language.None”。

请看看这个..

【问题讨论】:

    标签: python django django-rest-framework django-serializer


    【解决方案1】:

    由于 languagereverse relation,它不应该是 CharField。因此,您必须定义一个 LanguageSerializer() 并将其映射到您的 GetCompanySerializer 中,如下所示,

    class LanguageSerializer(serializers.ModelSerializer):
        class Meta:
            fields = '__all__'
            model = Language
    
    
    class GetCompanySerializer(serializers.ModelSerializer):
        language = LanguageSerializer(many=True)
    
        class Meta:
            model = Company
            fields = ('company_name', 'started_from', 'country', 'email', 'website', 'ip', 'active', 'language')



    如果您希望获得 Language 模型的 __str__() 表示,请使用 StringRelatedField() 而不是 @ 987654331@

    class GetCompanySerializer(serializers.ModelSerializer):
        language = serializers.StringRelatedField(many=True)
    
    class Meta:
        model = Company
        fields = ('company_name', 'started_from', 'country', 'email', 'website', 'ip', 'active', 'language')</code></pre>
    

    【讨论】:

    • 这样它给出了 "language": [ "python" ] 但我期待 "language": "python"
    • @KiranSyoutubechannel 这是因为每个公司实例都与一个或多个Languages相关。
    • 您可以以某种方式做到这一点,但它可能给您带来一些困惑。 (因为它有不止一种语言,此时应该返回哪个语言实例?)
    猜你喜欢
    • 2017-10-03
    • 1970-01-01
    • 2019-05-20
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 2016-07-19
    • 2019-12-23
    相关资源
    最近更新 更多