问题描述
分类学是根据共有的特征来定义和命名生物有机体群的科学。有机体被组合成分类群(单数:分类群),并且这些分类群被给予分类等级。现代使用的主要等级是域、王国、门、类、目、科、属和种。
有关维基百科中Taxonomy和Taxonomic ranks的更多信息。
下面是在维基百科的TaxonomicRank一文中红狐的例子,我需要创建这样的JSON输出:
{
"species": "vulpes",
"genus": "Vulpes",
"family": "Canidae",
"order": "Carnivora",
"class": "Mammalia",
"phylum": "Chordata",
"kingdom": "Animalia",
"domain": "Eukarya"
}
由于django rest框架基于字段名创建键,所以分类排名类(示例中为粗体)出现了问题,因为它是Python中的保留字,不能用作变量名。
我试过的
在Django中创建的模型类如下所示:
class Species(models.Model):
species = models.CharField()
genus = models.CharField()
family = models.CharField()
# class = models.CharField() - class is reserved word in Python
# class_ = models.CharField() - Django doesn't allow field names
# ending with underscore. That wouldn't be either a satisfying solution.
# further fields
问题
是否有任何可能的方法来解决这个问题并生成所需的输出?
如果不是,解决这个问题的最佳实践是什么?
最佳答案
你可以像下面这样做
class SpeciesSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Species
fields = (
'url', 'id', 'canonical_name', 'slug', 'species', 'genus',
'subfamily', 'family', 'order','class', 'phylum',
'ncbi_id', 'ncbi_taxonomy',
)
read_only_fields = ('slug',)
extra_kwargs = {
'url': {'lookup_field': 'slug'}
}
SpeciesSerializer._declared_fields["class"] = serializers.CharField(source="class_name")
如以下答案所述
https://stackoverflow.com/a/47717441/2830850