اذهب إلى المحتوى

السؤال

نشر

السلام عليكم،

تعلمت بعض أساسيات django rest framework وطورت API بسيط لإدارة مخزن وإستعنت بالذكاء الإصطناعي أثناء عملية التطوير ولحل المشكلات، الشروع عبارة عن API يسمح للمستخدم بإضافة منتجات وتصنيفات كما انه يراقب حركة البيع والشراء ودخول وخروج المنتجات كما يمكن البحث عن المنتجات وإضافة شروط وتصفية البحث وترتيبه.

هل يستطيع أحد مراجعة المشروع كي يرا ان كان مبني بشكل جيد وان كان بحاجة الى تحسين؟ وهل استخدام الذكاء الإصطناعي أثناء التعلم قد يؤثر علي سلباً؟ مع العلم اني أفهم جيداً كامل البرنامج النهائي وقمت بعدة مشاريع بسيطة من قبل وحدي. وأخيرا هل يجب إضافة الى settings هذا الكود لكي أحول API الى JSON ام ليس هناك داعي واستطيع استدام الAPI كما هو

REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
    ],
}

يمكنك استخدام حساب admin مع كلمة سر admin ان لزم الامر

api-inventory-ms.zip

Recommended Posts

  • 0
نشر

وعليكم السلام ورحمة الله وبركاته.

أحسنت عمل رائع أنك تعلمت أساسيات django rest framework وتقوم بالتطبيق عليه .

المشروع جيد بالفعل ولكن توجد بعض التحسينات التي يمكنك إضافتها.

بما أنك تتعامل في مشروع إدارة مخازن إذا من المتوقع أن البيانات ستكون كبيرة ولهذا يفضل إستخدام الصفحات (Pagination) لتحسين الأداء عند استرجاع البيانات وعدم إرجعاها جميعا كما تفعل من خلال objects.all() .

أيضا لاحظ أنك لم تستعمل الصلاحيات حيث يمكن لأى شخص الوصول إلى ال API وإرسال الطلبات وهذا من الممكن أن يؤدي إلى مشاكل في الوصول الغير مرغوب فيه لتطبيقك لهذا يجب إستخدام نظام الصلاحيات.

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

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

أما بخصوص الكود الذي ذكرته في إعدادات settings.py :

  • DEFAULT_FILTER_BACKENDS: هذا الخيار يتيح لك استخدام django_filters لترشيح البيانات .
  • DEFAULT_RENDERER_CLASSES: هذا الخيار سيحدد كيف يتم عرض البيانات.لذلك إذا كنت ترغب في عرض البيانات بتنسيق JSON فقط فيمكنك إضافة هذا الكود. لكن إذا كنت لا تحتاج إلى تخصيص هذا الإعداد فلا داعي لإضافته . حيث إذا لم تقم بتفعيله وذهبت إلى المتصفح ستجد أنه يوضح لك أمور كثيرة لل api الحالي ويمكنك البحث والفلترة كما لو أنك في موقع واجهة أمامية :
    image.thumb.png.596fb8c5b5e91f34e37e00515544a2d1.png
  • 0
نشر

Django REST Framework يدعم بشكل افتراضي تقديم البيانات بصيغة JSON بفضل JSONRenderer، بالإضافة إلى صيغ أخرى مثل صيغة HTML عبر واجهة المتصفح Browsable API، لذا لا حاجة لإضافة ما ذكرته حيث الإعداد الافتراضي لـ DEFAULT_RENDERER_CLASSES في DRF يشمل:

'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',

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

كتحسين، حاليًا تعديل أو حذف InventoryTransaction لا يُحدِّث المخزون تلقائيًا، عليك منع التعديلات على المعاملات بعد إنشائها Read-Only وإضافة إشارات Signals أو Override لـ delete() لتحديث المخزون عند الحذف.

ومن حيث نقطة الأمان والمصادقة فلا يوجد Authentication للوصول إلى الـ API تحتاج إلى إضافة الإعدادات التالية:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10,
    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
}

وفي لوحة الإدارة النماذج غير مسجَّلة في Admin، عليك تسجيل النماذج في admin.py.

from .models import Category, Product, InventoryTransaction

admin.site.register(Category)
admin.site.register(Product)
admin.site.register(InventoryTransaction)

وكتحسين للاستعلامات، فحاليًا في low_stock،  تُعاد منتجات ذات min_quantity=0 إن وجدت، بالتالي عليك تعديل الاستعلام ليتجاهل min_quantity=0.

وفي InventoryTransaction.save()، لو الكمية غير كافية لـ OUT، يتم رفع استثناء ValueError، من الأفضل التعامل مع ذلك في المُسلسل بدلاً من النموذج لإرجاع استجابة مناسبة للمستخدم.

ولديك ProductViewSet مع إجراء مخصص @action وهو transactions، والذي يعود بجميع المعاملات InventoryTransaction المرتبطة بمنتج معين، لكن عند تنفيذه، ربما تحدث مشكلة تُعرف بـ N+1 Query Problem أو مشكلة الاستعلامات المتعددة غير الضروري، يعني أن Django يقوم بإجراء استعلامات إضافية على قاعدة البيانات لكل معاملة لجلب بيانات المنتج المرتبط بها، وذلك يؤدي إلى بطء في الأداء إن كان هناك عدد كبير من المعاملات.

Django يوفر أداتين لتحسين الاستعلامات وتقليل عدد الطلبات إلى قاعدة البيانات:

  • select_related مع العلاقات من نوع ForeignKey أو OneToOneField يقوم بجلب البيانات المرتبطة في نفس الاستعلام باستخدام JOIN في SQL، بالتالي مناسب  للوصول إلى النموذج المرتبط مباشرة مثل transaction.product.
  • prefetch_related مع العلاقات من نوع ManyToManyField أو العلاقات العكسية مثل product.transactions ويقوم بجلب البيانات المرتبطة في استعلام منفصل، ثم يربطها في الذاكرة، مما يقلل من الاستعلامات المتكررة، بالتالي مناسب للتتعامل مع قائمة من الكائنات المرتبطة.
@action(detail=True, methods=['get'], url_path='transactions')
def transactions(self, request, pk=None):
    product = self.get_object()
    transactions = InventoryTransaction.objects.filter(product=product).select_related('product')
    serializer = InventoryTransactionListSerializer(transactions, many=True)
    return Response(serializer.data)

وعليك معالجة الصور أيضًا حيث image_url كـ URLField لا يدعم رفع ملفات هل تنوي تخزين روابط فقط به؟ في حال تريد رفع صور  استخدم ImageField مع تكوين تخزين مناسب مثل django-storages.

ولا يوجد توثيق واضح للـ API، تستطيع فعل ذلك بسهولة من إضافة مكتبة drf-yasg أو drf-spectacular إلى INSTALLED_APPS لتوليد واجهة توثيق تلقائية:

INSTALLED_APPS += ['drf_spectacular']
REST_FRAMEWORK['DEFAULT_SCHEMA_CLASS'] = 'drf_spectacular.openapi.AutoSchema'

ودائمًا في المشاريع يجب تطبيق unit tests أي إختبارات وأسهل طريقة هي من خلال APITestCase من DRF لاختبار الـ API Endpoints.

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...