簡體   English   中英

將第3方庫中的對象用作Django Rest Framework開發中的模型

[英]Use objects from a 3rd party library as models in Django Rest Framework development

我試圖在標題中盡可能地描述它,但是基本上,我想使用Django REST Framework編寫一個API,但是我不想使用Django db和預定義模型,而是希望我的API從用戶,使用它調用另一個庫函數,獲取第3方lib返回的對象,根據返回的內容構建模型,序列化為JSON,然后將其返回給JSON。

現在,我正在使用Extremeley簡單類adn函數來測試此概念。 它有一個對象定義和一個從文本文件讀取並將其轉換為對象列表的函數:

class myObj:
    id = None
    port = None
    cust = None
    product = None

    def __init__(self, textLine):
        props = [x.strip() for x in textLine.split(',')]
        self.id = props[0]
        self.port = props[1]
        self.cust = props[2]
        self.product = props[3]

def getObjList():
    lines = [line.strip() for line in open("objFile.txt")]
    objList = [myObj(x) for x in lines]
    return objList

我希望我的Django REST項目在嘗試訪問瀏覽器中的關聯URL時調用該getObjList函數(或通過curl或somethig進行調用),基於它返回的對象構建模型,創建該模型的列表,進行序列化並將其還給我,以便我可以在可瀏覽的Web界面中查看它。 這可能嗎?還是我是個白痴?

謝謝,我現在已經是C#開發人員了一段時間,但是現在在Python中工作,並且使用此HTTP東西有點讓人不知所措。

如果有人在乎我發現了問題,我將不得不完全跳過模型,而只是直接基於返回的對象來構建序列化器,而且我不得不恢復使用更基本的django視圖。

這是視圖:

@api_view(['GET'])
def ObjView(request):
    if request.method == 'GET':
        objList = myObj.getObjList()
        dynamic_serializer = SerializerFactory.first_level(objList)
        return Response(dynamic_serializer.data)

getObjList函數是我的問題中發布的函數,但是它應該與任何函數以及返回的任何對象一起使用,這是序列化程序工廠中發生的事情:

from rest_framework import serializers


def first_level(cur_obj):
    isList = False
    ser_val = cur_obj
    if type(cur_obj) in {list, tuple}:
        isList = True
        ser_val = cur_obj[0]

    dynamic_serializer = create_serializer(ser_val)
    return dynamic_serializer(cur_obj, many=isList)


def create_serializer(cur_obj):
    if type(cur_obj) in {list, tuple}:
    if hasattr(cur_obj[0], "__dict__"):
        cur_ser = create_serializer(cur_obj[0])
        return cur_ser(many=True)
    else:
        return serializers.ListField(child=create_serializer(cur_obj[0]))
    elif type(cur_obj) == dict:
        if hasattr(cur_obj.values()[0], "__dict__"):
            child_ser = create_serializer(cur_obj.values()[0])
            return serializers.DictField(child=child_ser())
        else:
            return serializers.DictField(child=create_serializer(cur_obj.values()[0]))
    elif hasattr(cur_obj, "__dict__"):
        attrs = {}
        for key, val in cur_obj.__dict__.items():
            if "__" not in key:
                cur_field = create_serializer(val)
                if hasattr(val, "__dict__"):
                    attrs.update({key: cur_field()})
                else:
                    attrs.update({key: cur_field})
        return type(cur_obj.__name__ + "Serializer", (serializers.Serializer,), attrs)
    else:
        return serializers.CharField(required=False, allow_blank=True, max_length=200)

如您所見,我必須將其分成兩部分(我敢肯定有一種方法可以使它成為一個部分,但是花時間在我身上是不值得的),並且它涉及大量的遞歸,並且通常在處理不同的字段類型時,這對於序列化對象,列表,字典和簡單數據類型的任何組合應該是不錯的選擇。 我已經在各種各樣的對象上對其進行了測試,而且看起來還不錯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM