第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

允許在 Django Rest Framework 序列化器字段名稱中使用連字符

允許在 Django Rest Framework 序列化器字段名稱中使用連字符

慕桂英3389331 2021-12-29 20:53:44
鑒于我正在編寫代碼的 OpenAPI 規(guī)范要求在請求正文中使用連字符大小寫(又名 kebab-case)變量名稱,在使用 Django Rest Framework 時(shí)應(yīng)如何處理?例如,POST /thing創(chuàng)建事物的請求具有以下主體:{    "owner-type": "platform"}但是在Python,owner-type不是有效的變量名(“語法錯(cuò)誤:無法分配給經(jīng)營者”),這樣反而Thing有owner_type在模型中定義:class Thing(models.Model):    owner_type = models.CharField(max_length=8)但現(xiàn)在ThingSerializer有問題,因?yàn)樵俅蝟wner-type是一個(gè)非法名稱。這是不允許的:    owner-type = serializers.CharField(...)我試圖ModelSerializer通過嘗試調(diào)整由 生成的字段名稱來覆蓋名稱的生成方式get_fields(),但它失敗了。這是我的序列化程序:class ThingSerializer(serializers.ModelSerializer):    class Meta:        model = Thing        fields = [            'owner_type',        ]    def get_fields(self):        fields = super().get_fields()        out_fields = OrderedDict()        for field_name, field in fields.items():            out_fields[field_name.replace('_', '-')] = field        return out_fields和錯(cuò)誤:../venv/lib/python3.6/site-packages/rest_framework/fields.py:453: in get_attribute    return get_attribute(instance, self.source_attrs)../venv/lib/python3.6/site-packages/rest_framework/fields.py:101: in get_attribute    instance = getattr(instance, attr)E   AttributeError: 'Thing' object has no attribute 'owner-type'所以我的問題 - 如何配置 DRF 模型序列化器以允許包含下劃線的模型字段被序列化/反序列化,以便 API 客戶端看到連字符而不是下劃線?這將是上面示例的通用解決方案,其中Thing.owner_type應(yīng)該通過"owner-type"在 JSON 正文中傳遞字段來讀取/寫入。我在 Python 3.6 上使用最新的 Django 和 DRF。編輯 1:澄清理想情況下,這將是將下劃線轉(zhuǎn)換為連字符的通用解決方案。
查看完整描述

3 回答

?
幕布斯7119047

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊

您可以使用連字符定義字段名稱,fields并通過定義source屬性將其映射到正確的 Django 模型字段extra_kwargs- 請參閱https://www.django-rest-framework.org/api-guide/serializers/#additional-keyword-arguments


要回答您的問題,您定義ThingSerializer如下:


class ThingSerializer(serializers.ModelSerializer):

    class Meta:

        model = Thing

        fields = [

            'owner-type',

        ]

        extra_kwargs = {

            'owner-type': {'source': 'owner_type'},

        }


查看完整回答
反對 回復(fù) 2021-12-29
?
滄海一幻覺

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超5個(gè)贊

您可以使用to_internal_valueDjango 的(參見 DJango Serializer 字段)來獲取帶連字符的密鑰并重命名它。


例子:


class Thing(models.Model):

    owner_type = models.CharField(max_length=8)

    

    def to_internal_value(self, data):

        data['owner_type'] = data['owner-type']

        data.pop('owner-type', None)

        return data


查看完整回答
反對 回復(fù) 2021-12-29
?
斯蒂芬大帝

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊

這在使用模型時(shí)沒有用,但回答字段中連字符的使用,更改序列化程序如下



class ThingSerializer(serializers.Serializer):

   def __init__(self, *args, **kwargs):

        super().__init__(*args, **kwargs)

        self.fields.update({"owner-type": serializers.CharField(write_only=True)})


查看完整回答
反對 回復(fù) 2021-12-29
  • 3 回答
  • 0 關(guān)注
  • 181 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號