我正在学习Django和Django Ninja API。我创建了一个简单的API来创建和读取对象。
models.py
class Person (models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
schemas.py
class PersonIn(ModelSchema):
class Config:
model = Person
model_fields = ["first_name", "last_name"]
class PersonOut(ModelSchema): # Just to make it clear
class Config:
model = Person
model_fields = ["first_name", "last_name"]
api.py
@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 = ???
render(request,"personlist_template.html", {"persons": persons})
如果我导入函数API,那么它返回Person Model对象,而不是PersonOut形式的序列化对象。
我想使用API调用的方式,它返回通过API url调用的序列化表单。这样我尝试着
1.避免再次重写该序列化代码。
1.另外,我想在模板中使用键:值对来为所有属性生成一个表。
我找到了2个方法来实现目标2。
一个是使用Django Serializers。在这种情况下,我需要有单独的方法,如果我是序列化单一模型的示例。
from django.core import serializers
data = serializers.serialize("json", Person.objects.all())
或者使用方法Person.Objects.values()
或另一种方法,例如model_to_dict或编写自定义DjangoJSONencoder。但是,这只是额外的编码,当我已经在API中实现了。
我假设有一些直接向前调用的API函数在一个视图中的装饰魔术Ninja工作。就是找不到。
1条答案
按热度按时间qnakjoqk1#
也许这对你有用