从django视图内部调用Django Ninja API

z0qdvdin  于 2023-05-19  发布在  Go
关注(0)|答案(1)|浏览(158)

我正在学习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工作。就是找不到。

qnakjoqk

qnakjoqk1#

也许这对你有用

def serialize(schema_cls, queryset):
     items = [schema_cls.from_orm(i).dict() for i in queryset]
     return json.dumps(items)

...
persons = serialize(PersonOut, Person.objects.all())

相关问题