Skip to main content
 首页 » 编程设计

python之Django REST json 解析 id 而不是名称

2024年10月01日30xiaohuochai

我是 Django(和 DjangoREST 框架)的新手,并且我一直在努力解决以下问题:

我希望“especies”(为葡萄牙语道歉......)是一个带有模型 Especies 名称的向量(请向下滚动),而是给我对应于 Especie 的 id。

"especies": [ 
            13, 
            14 
        ] 

我想要,例如:

"especies": [ 
            Z1, 
            Z2 
        ] 

提前致谢!

解析的 JSON:

    { 
    "count": 1, 
    "next": null, 
    "previous": null, 
    "results": [ 
        { 
        "codigo": "Z3", 
        "area": "Z_tres", 
        "especies": [ 
            13, 
            14 
        ], 
        "id": 17 
    } 
    ] 
} 

来自 DJANGO REST 应用程序:

views.py

from django.shortcuts import render 
from species.models import Especie, Zona, EspecieZona 
from rest_framework import viewsets 
from rest.serializers import ZonaSerializer 
 
class ZonaViewSet(viewsets.ModelViewSet): 
    queryset = Zona.objects.all() 
    serializer_class = ZonaSerializer 

序列化器.py

from species.models import Zona 
from rest_framework import serializers 
 
class ZonaSerializer(serializers.ModelSerializer): 
    class Meta: 
        model = Zona 
        fields = ('codigo', 'area', 'especies', 'id') 

此应用中的 models.py 是空的。

来自主应用

模型.py

from django.db import models 
 
class Zona(models.Model): 
    codigo          = models.CharField(max_length=120) 
    area            = models.CharField(max_length=120) 
    especies        = models.ManyToManyField("Especie", blank=True) 
    def __str__(self): 
        return self.codigo 
 
class Especie(models.Model): 
    nome            = models.CharField(max_length=120) 
    nome_latino     = models.CharField(max_length=120) 
    data_insercao   = models.DateTimeField(auto_now_add=True) 
    actualizacao    = models.DateTimeField(auto_now=True) 
    zonas           = models.ManyToManyField("Zona",blank=True ) 
    def __str__(self): 
        return self.nome 

我相信我已经发布了这个特定案例的所有相关代码。

再次感谢!

请您参考如下方法:

模型.py

class Zona(models.Model): 
    codigo = models.CharField(max_length=120) 
    area            = models.CharField(max_length=120) 
    especies        = models.ManyToManyField("Especie", blank=True) 
 
    def __str__(self): 
        return self.codigo 
 
    def get_especies(self): 
        return self.especies.all().values_list('nome', flat=True) 

序列化器.py

class ZonaSerializer(serializers.ModelSerializer): 
    especies = serializers.ReadOnlyField(source='get_especies')