如何在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
相关产品推荐
相关产品推荐

