(11) ورشة تطوير تطبيقات الويب باستخدام Django: بناء ال orders


#1

أهلا بالجميع

فهرس موضوعات الورشة

فهرس موضوعات ورشة تطوير تطبيقات الويب باستخدام Django


في الدروس السابقة أعددنا كل ما يتعلق ب Product أي Model, views, templates… اليوم سننطلق في رحلة معمقة مع ORMs و سنبني من خلالها Order Model

جانقو يتيح لنا الاختيار بين عدة ORMs أهمها:

  • ا Django ORM و هو الاختيار الافتراضي
  • ا SQLAlchemy

ماهو الفرق بينهما ؟

الفرق بين ال ORMs في النمط - Pattern - الدي يعتمد عليه كل واحد … ف Django ORM يعتمد على Active Record Pattern فيما يعتمد SQLAlchemy على Data Mapper Pattern

ماهو Pattern ؟

هو حل عام و متفق عليه لمشكل متكرر أي هو نمودج و طريقة يمكننا استعمالها مباشرة عند مواجهة المشكل لتسريع وتيرة العمل و تسهيلها

ماهو Active Record ؟

هو نمط - pattern - يعتمد عليه الكثير من ال ORMs كحل للتعامل و الوصول الى قاعدة البيانات و من بينهم جانقو … وضع له هاته التسمية Martin Fowler الدي وضع كدلك الكثير من النمادج للكثير من المشاكل

ماهو الدي ينصه Active Record ؟

النمط ينص على أن نجعل لكل جدول في قاعدة البيانات كلاس تقابلها في Python أو أي لغة أخرى و بالتالي يصير كل صف -row- من الجدول يقابله object… وبالتالي العلاقة تكون مباشرة بين و الصف و الobject الدي يحتوي على كل البيانات و كدلك السلوك المتعلق بهدا الصف (انشاء, تحديث…)
مثلا يتم انشاء الصف لما ننشئ ال object و نعمل save و يتغير لما نغير ال object

ما الدي سنحصل عليه ؟

activeRecordSketch

ماهو Data Mapper؟

نمط Data Mapper يعتمد على وضع طبقة وسطى بين ال Logic Layer و Database هي المسؤولة عن ترجمة البيانات الى قاعدة البيانات و بالتالي تصير ال Logic Layer مستقلة عن قاعدة البيانات أو Persistence Layer

databaseMapperSketch

أووبس, ماهو Logic Layer ؟

هي جزء من نمودج multi-tier architecture الدي تبنى عليه التطبيقات و يعتمد على تقسيمها الى طبقات بحيث كل طبقة مخصصة في عمل و شغل معين
هناك ثلاث طبقات أساسية ( ولكن يمكن نجد طبقات أخرى على حسب نوع التصميم المعتمد ) وهي:

  • طبقة البيانات - Data Layer - مهمتها تخزين البيانات … في حالتنا هي قاعدة البيانات
  • طبقة العمل أو التطبيق - Logic Layer - التي تهتم بتحويل البيانات و القيام بكل الأوامر و السلوكات في التطبيق
  • طبقة العرض - Presentation Layer - و هي الطبقة العليا تقوم بعرض النتائج

الصورة التالية توضح دلك

لمادا علي أن أعرف أنواع الأنماط ؟

الاحاطة بهدا الموضوع يفيدك في اختيار ال ORM المناسب للعمل به حسب الاحتياج

  • ف Django ORM و Active Record عامة مناسب للعمل على المشاريع التي تعتمد على queries بسيطة و ترتيب يشبه طريقة تنظيم قاعدة البيانات
  • بالعكس مع SqlAlchemy و Data Mapper الدي هو مناسب في المشاريع الت تنظيمها و خاصة تنظيم ال Models فيه الكثير من ال logic

بعد القليل من التنظير نمر الى اكمال بناء ال models

ما الدي سنقوم به ؟

نريد أن يصير المستخدم قادرا على أن يقوم بطلبات Orders قبل أن يقوم بالدفع و بالتالي نحتاج Order model الدي يربط بين User و Product بعلاقة many to many

ماهي العلاقات relationships ؟

لكل صف من جدول معين مفتاح خاص يميزه هو Primary Key … تكون لدينا علاقة بين جدولين لما أحد الجداول يحتوي على مفتاح يدل على الجدول الآخر أو Foreign Key

ماهي علاقة Many To Many ؟

هي علاقة أين كل صف من جدول A يكون مرتبط بعدة صفوف من جدول B و في نفس الوقت كل صف من B يرتبط بعدة صفوف من A
مثلا: لدينا جدولين Product و User … كل User يمكنه أن يطلب عدة products و كل product يمكن أن يشتريه عدة users

لكن لربط الجدولين بعلاقة many to many يجب أن نعرف جدول وسيط يكون الرابط بينها و الدي في حالتنا هو Order فيكون ال models كالتالي

مادا يحتوي الجدول الوسيط ؟

يحتوي الجدول الوسيط على مفتاحين واحد يدل على الجدول الأول و الآخر يدل على الجدول الثاني

ما الفرق مع one to many ؟

العلاقة one to many هي علاقة يكون فيها صف من جدول A مرتبط بعدة صفوف من B لكن العكس غير صحيح و بالتالي لا نحتاج الجدول الوسيط
مثلا: كل user يكون لديه عدة addresses و لكن كل address مرتبطة ب user واحد كالتالي

Screenshot%20from%202018-06-01%2018-57-56

كيف أضيف علاقة many to many في جانقو ؟

باستعمال models.ManyToManyField … نضيف في Product:

	ordering_users = models.ManyToManyField(User, through='Order', related_name='ordered_products')

و اضافة Order و ربطه ب User و Product بحيث كل order يحتوي

  • مفتاح ل user

  • مفتاج ل product

  • تاريخ عمل ال order
    كالتالي

  • الكمية

      class Order(models.Model):
          user = models.ForeignKey(User, on_delete=models.DO_NOTHING)
          product = models.ForeignKey(Product, on_delete=models.DO_NOTHING)
          created = models.DateTimeField(auto_now_add=True)
          quantity = models.PositiveIntegerField(default=1)
    

ملاحظة: يمكن اضافة ManyToManyField بدون through وهو يضيف الجدول الوسيط في مكاننا لكن بما أننا نحتاج أن نضيف تاريخ ال order فعلينا أن نقوم بدلك يدويا

كيف أضيف one to many في جانقو ؟

كل ما علينا فعله هو اضافة Foreign Key في ال model الدي يمثل one في العلاقة كالتالي

      field = models.ForeignKey(User, on_delete=models.CASCADE)  

هل هناك أنواع علاقات أخرى ؟

نعم مازال هناك one to one أين يكون كل صف من جدول A مربوط بصف آخر وحيد من جدول B و العكس أيضا

مثلا العلاقة بين Profile و User حيث كل user لديه profile وحيد و كل profile مرتبط ب user وحيد

Screenshot%20from%202018-06-01%2019-20-45

كيف أضيف العلاقة في جانقو ؟

باستعمال OneToOneField كالتالي

	user = models.OneToOneField(User, on_delete=models.CASCADE)

ما الدي نحتاجه الآن ؟

لقد انتهينا من بناء ال orders لكن لازلنا أن نحتاج أن نضيف لها العديد من النقاط قبل أن نقوم بعمل ال views الخاصة ب order و هي :

  • بناء ال shopping cart باستعمال sessions
  • بناء ال forms الخاصة ب order و cart
  • بناء نظام التسجيل لدخول ال users
  • التعرف على طريقة ارسال الايميلات لارسال التنويهات للمستخدم
  • التعرف على آلية الدفع باستعمال paypal

لكن يكفينا ما قمنا به الآن نمر الى مهمة اليوم

ما هي المهمة المطلوبة ؟

  • أولا : انشئ تطبيق جديد و سمه orders

  • ثانيا : أعد ما قمنا به و اعد بناء Order داخل التطبيق

  • ثالثا : تفقد الروابط المرفقة و تعرف أكثر على الأنماط المستعملة في ال ORMs و كدلك على خصائص العلاقات

*الروابط المرفقة

ا active record
ا data mapper
ا active record vs data mapper
ا database relationships

تسليم الحلول

(12) ورشة تطوير تطبيقات الويب باستخدام Django:مشاركة حلول بناء ال orders


(12) ورشة تطوير تطبيقات الويب باستخدام Django: مشاركة حلول بناء ال orders
#2

شكرا :star_struck::star_struck::star_struck::star_struck:
لقد انتظرنا طويلاً


#3

لا شكرا على واجب @sohep :heart:

لاتنسى القاء نظرة على الروابط الملحقة

بالتوفيق


#4

السلام عليكم اخى هشام
ومرحباً بعودتك مره اخرى

اعتقد اننا نحتاج لاضافة ال user model لأنه عند عمل ال migrations سيتطلب وجود User model ?
ام اننا سنستخدم django default user model ?


#5

ا @MRamadan بالضبط …
User Model موجود افتراضيا في جانقو بمجرد اضافة django.contrib.auth في INSTALLED_APPS

سنتعمق في دلك في درس قادم حول ال authentication