You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django视图中调用Django Ninja API并获取序列化结果?

问题:复用Django Ninja的序列化逻辑在Django视图中

我正在学习Django和Django Ninja API,已经实现了一个用于创建和读取Person对象的简单API,但在Django视图中想复用API里的序列化逻辑,避免重复编码。

现有代码如下:

models.py

class Person(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

schemas.py

from ninja import ModelSchema
from .models import Person

class PersonIn(ModelSchema):
    class Config:
        model = Person
        model_fields = ["first_name", "last_name"]

class PersonOut(ModelSchema): # 明确输出结构
    class Config:
        model = Person
        model_fields = ["first_name", "last_name"]

api.py

from ninja import Router
from django.shortcuts import get_list_or_404
from .models import Person
from .schemas import PersonIn, PersonOut

router = Router()

@router.post("/person")
def create_person(request, payload: PersonIn):
    data = payload.dict()
    try:
        person, created = Person.objects.update_or_create(**data)
    except Exception:
        return {"mesg": "Some error happened"}

@router.get("/persons", response=list[PersonOut])
def get_persons(request):
    p = get_list_or_404(Person)
    return p

views.py(待完善)

def get_persons_view(request):
    persons = ???  # 这里需要获取序列化后的结果
    return render(request, "personlist_template.html", {"persons": persons})

直接调用API的get_persons函数返回的是Person模型对象,而非PersonOut序列化后的格式。我希望复用API中已有的序列化逻辑,避免重复编写代码,同时能在模板中用键值对生成属性表格。试过Django自带序列化器、values()、model_to_dict等方法,但都需要额外编码,想知道有没有直接触发Ninja装饰器逻辑或复用Schema的方法。


解决方案:直接使用PersonOut Schema序列化模型对象

Django Ninja的ModelSchema本身就具备序列化模型实例的能力,不需要依赖API路由的装饰器逻辑,直接在视图中调用Schema的序列化方法即可:

修改后的views.py

from django.shortcuts import render, get_list_or_404
from .models import Person
from .schemas import PersonOut

def get_persons_view(request):
    # 获取所有Person模型实例
    persons_queryset = get_list_or_404(Person)
    # 用PersonOut批量序列化模型实例为字典列表
    serialized_persons = [PersonOut.from_orm(p).dict() for p in persons_queryset]
    # 也可以用批量dump方法,效果一致
    # serialized_persons = PersonOut(many=True).dump(persons_queryset)
    return render(request, "personlist_template.html", {"persons": serialized_persons})

关键说明:

  • PersonOut.from_orm(p):将ORM模型实例转换为Schema对象,自动映射模型字段到Schema定义的结构
  • .dict():把Schema对象转换成Python字典,方便在Django模板中直接通过键名访问属性(比如{{ person.first_name }})
  • 单个实例序列化:如果只需要处理一个Person对象,直接用PersonOut.from_orm(single_person).dict()即可

这样完全复用了schemas.py中定义的序列化规则,不需要额外编写重复代码,得到的字典格式和API返回的结构完全一致。在模板中可以直接遍历生成属性表格:

<!-- personlist_template.html 示例 -->
<table>
    <thead>
        <tr>
            <th>First Name</th>
            <th>Last Name</th>
        </tr>
    </thead>
    <tbody>
        {% for person in persons %}
        <tr>
            <td>{{ person.first_name }}</td>
            <td>{{ person.last_name }}</td>
        </tr>
        {% endfor %}
    </tbody>
</table>

内容的提问来源于stack exchange,提问作者arundeep78

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 03:15:37