ضع في اعتبارك هذا المسلسل غير المجدي:
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())
، على غرار تعبيرات استعلام Djangoopenapi_type(serializers.SerializerMethodField(), serializers.IntegerField())
سمة ، على غرار تعيين الأوصاف لإجراءات المسؤول :
random_number = serializers.SerializerMethodField()
def get_random_number(self):
return 4
get_random_number.output_field = serializers.IntegerField()
مرحبًا @ 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. هذه هي الطريقة الصحيحة للذهاب هنا.
التعليق الأكثر فائدة
بالنسبة لي ، أعتقد أن واجهة برمجة التطبيقات التي أفضلها هي شيء يستخدم تلميح الكتابة مثل:
إنه يعمل في كل إصدار Python المدعوم حاليًا. تم استخدام هذه الفكرة في https://github.com/encode/django-rest-framework/pull/7089 ولكن لم يتم فصلها إلى علاقات عامة أخرى. بالنظر إلى هذا التطبيق ، يبدو أنه لا يتعامل مع المجموعات. في مرحلة ما ، من الأفضل استخدام مُسلسل متداخل ، لكن أعتقد أنه يجب دعم الحالات البسيطة مثل
List[int]
،List[str]
،Dict[str, int]
إلخ.carlfarrington ما رأيك؟ هل يستحق تجربة هذا النهج أم أن هناك مشاكل معه؟ إذا كان الأمر يستحق المحاولة ، فهل يستحق أيضًا الحصول على شيء أساسي يمكنه التعامل مع الأنواع الأساسية وتجاهل الحقول المتداخلة في الوقت الحالي أم أننا نريد (متداخلة أم لا) المصفوفات والعناصر من البداية؟