django rest 框架序列化器提供 "serializers.Language.None"
django rest framework serializers giving "serializers.Language.None"
这是我的 serializers.py
class GetCompanySerializer(serializers.ModelSerializer):
language = serializers.CharField()
class Meta:
model = Company
fields = ('company_name','started_from','country','email','website','ip','active','language')
这是我的 views.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"。
请看看这个..
因为 language
是 reverse relation,所以不应该是 CharField
。所以你必须定义一个 LanguageSerializer()
并将其映射到你的 GetCompanySerializer
中,如下所示,
<b>class LanguageSerializer(serializers.ModelSerializer):
class Meta:
fields = '__all__'
model = Language</b>
class GetCompanySerializer(serializers.ModelSerializer):
<b>language = LanguageSerializer(many=True)</b>
class Meta:
model = Company
fields = ('company_name', 'started_from', 'country', 'email', 'website', 'ip', 'active', 'language')
如果您希望得到 __str__()
的 Language
模型,使用StringRelatedField()
代替CharField()
class GetCompanySerializer(serializers.ModelSerializer):
<b>language = serializers.StringRelatedField(many=True)</b></p>
class Meta:
model = Company
fields = ('company_name', 'started_from', 'country', 'email', 'website', 'ip', 'active', 'language')</code></pre>
这是我的 serializers.py
class GetCompanySerializer(serializers.ModelSerializer):
language = serializers.CharField()
class Meta:
model = Company
fields = ('company_name','started_from','country','email','website','ip','active','language')
这是我的 views.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"。
请看看这个..
因为 language
是 reverse relation,所以不应该是 CharField
。所以你必须定义一个 LanguageSerializer()
并将其映射到你的 GetCompanySerializer
中,如下所示,
<b>class LanguageSerializer(serializers.ModelSerializer):
class Meta:
fields = '__all__'
model = Language</b>
class GetCompanySerializer(serializers.ModelSerializer):
<b>language = LanguageSerializer(many=True)</b>
class Meta:
model = Company
fields = ('company_name', 'started_from', 'country', 'email', 'website', 'ip', 'active', 'language')
如果您希望得到 __str__()
的 Language
模型,使用StringRelatedField()
代替CharField()
class GetCompanySerializer(serializers.ModelSerializer):
<b>language = serializers.StringRelatedField(many=True)</b></p>
class Meta:
model = Company
fields = ('company_name', 'started_from', 'country', 'email', 'website', 'ip', 'active', 'language')</code></pre>