Django-rest-framework: كيفية تعيين نوع حقل في SerializerMethodField لإنشاء مخطط OpenAPI؟

تم إنشاؤها على ١٣ يناير ٢٠٢٠  ·  3تعليقات  ·  مصدر: encode/django-rest-framework

ضع في اعتبارك هذا المسلسل غير المجدي:

class MySerializer(serializers.Serializer):

    random_number = serializers.SerializerMethodField()

    def get_random_number(self):
        # Chosen by fair dice roll.
        # Guaranteed to be random.
        return 4

بافتراض أنك أضفت هذا المسلسل في نقطة نهاية وأنشأت مخطط OpenAPI ، سيبدو المسلسل كما يلي:

properties:
  random_number:
    type: string
  required:
  - random_number

المشكلة هنا أنه لا توجد طريقة لإخبار DRF باستخدام type: number هنا. فكرت في بعض الاحتمالات:

  • سمة output_field ، مثل serializers.SerializerMethodField(output_field=serializers.IntegerField()) ، على غرار تعبيرات استعلام Django
  • مصمم ، مثل openapi_type(serializers.SerializerMethodField(), serializers.IntegerField())
  • سمة ، على غرار تعيين الأوصاف لإجراءات المسؤول :

    random_number = serializers.SerializerMethodField()
    
    def get_random_number(self):
      return 4
    
    get_random_number.output_field = serializers.IntegerField()
    
  • ببساطة شيء لا يدعمه DRF ، والذي ربما يجب توثيقه في مكان ما كتحذير محتمل.
Enhancement Schema Generation

التعليق الأكثر فائدة

بالنسبة لي ، أعتقد أن واجهة برمجة التطبيقات التي أفضلها هي شيء يستخدم تلميح الكتابة مثل:

def get_foo(self, obj) -> int:
    return 1

إنه يعمل في كل إصدار Python المدعوم حاليًا. تم استخدام هذه الفكرة في https://github.com/encode/django-rest-framework/pull/7089 ولكن لم يتم فصلها إلى علاقات عامة أخرى. بالنظر إلى هذا التطبيق ، يبدو أنه لا يتعامل مع المجموعات. في مرحلة ما ، من الأفضل استخدام مُسلسل متداخل ، لكن أعتقد أنه يجب دعم الحالات البسيطة مثل List[int] ، List[str] ، Dict[str, int] إلخ.

carlfarrington ما رأيك؟ هل يستحق تجربة هذا النهج أم أن هناك مشاكل معه؟ إذا كان الأمر يستحق المحاولة ، فهل يستحق أيضًا الحصول على شيء أساسي يمكنه التعامل مع الأنواع الأساسية وتجاهل الحقول المتداخلة في الوقت الحالي أم أننا نريد (متداخلة أم لا) المصفوفات والعناصر من البداية؟

ال 3 كومينتر

مرحبًا @ Lucidiot.

أعتقد أن الطريقة الفورية للقيام بذلك هي تجاوز AutoSchema._map_field() .

يمكنك إما القيام بذلك لكل مسلسل / عرض لتوقع الحقل المعني ، أو إضافة سمة كما تقول.

سننتقل إلى شيء بهذه الطريقة في النهاية ، لكنني حاليًا لست متأكدًا من الخيار الأفضل ، فيما يتعلق بواجهة برمجة التطبيقات.

بالنسبة لي ، أعتقد أن واجهة برمجة التطبيقات التي أفضلها هي شيء يستخدم تلميح الكتابة مثل:

def get_foo(self, obj) -> int:
    return 1

إنه يعمل في كل إصدار Python المدعوم حاليًا. تم استخدام هذه الفكرة في https://github.com/encode/django-rest-framework/pull/7089 ولكن لم يتم فصلها إلى علاقات عامة أخرى. بالنظر إلى هذا التطبيق ، يبدو أنه لا يتعامل مع المجموعات. في مرحلة ما ، من الأفضل استخدام مُسلسل متداخل ، لكن أعتقد أنه يجب دعم الحالات البسيطة مثل List[int] ، List[str] ، Dict[str, int] إلخ.

carlfarrington ما رأيك؟ هل يستحق تجربة هذا النهج أم أن هناك مشاكل معه؟ إذا كان الأمر يستحق المحاولة ، فهل يستحق أيضًا الحصول على شيء أساسي يمكنه التعامل مع الأنواع الأساسية وتجاهل الحقول المتداخلة في الوقت الحالي أم أننا نريد (متداخلة أم لا) المصفوفات والعناصر من البداية؟

سنقوم بترقية وتوثيق map_field() لـ 3.12. هذه هي الطريقة الصحيحة للذهاب هنا.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات