Python - Django - تصميم نموذج الحقول العامة

0

أحتاج إلى بعض الأفكار لحل المشكلة التالية ، ربما مع بعض نمط التصميم أو نهج آخر في معماري الحالي.

تم تطوير الواجهة الخلفية لتطبيقي بالكامل في إطار Django ولديه خمسة نماذج حالية (بغض النظر عن العلاقات بينهما):

  • المنتج (الرقم التعريفي ، اسم_المنتج ، فئة_المنتج ، رمز_المنتج)
  • العميل (معرف ، اسم_العميل)
  • الحساب (معرف ، كود_الحساب ، اسم_الحساب)
  • المدينة (id ، city_name)
  • المستخدم (المعرف ، البريد الإلكتروني ، اسم المستخدم)

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

  • مثال 1: المعاملة (المعرّف ، المنتج ، العميل ، السنة ، الشهر ، المبلغ)
  • مثال 2: معاملة (رقم التعريف ، الحساب ، السنة ، الشهر ، المبلغ)
  • مثال 3: المعاملة (رقم التعريف ، الحساب ، المدينة ، السنة ، الشهر ، المبلغ)
  • مثال ن: معاملة (رقم تعريف ، منتج ، مستخدم ، سنة ، شهر ، مبلغ

كما ترى ، يحتوي نموذج المعاملات الخاص بي على عدد قليل من الحقول الثابتة (السنة والشهر والمبلغ) ، ولكن الحقول الأخرى تعتمد على تخصيص عشوائي وفقًا لحالة الاستخدام.

لقد فكرت في شيء مثل المعاملة (id ، dynamic_field_1 ، dynamic_field_2 ، dynamic_field_3 ، السنة ، المبلغ) ، ولكن كيف يمكنني إجراؤها ديناميكيًا؟ هل هناك نمط تصميم أو طريقة مناسبة للقيام بذلك؟

بالإضافة إلى ذلك ، أحتاج إلى التحقق من صحة هذه الحقول من النماذج السابقة. فمثلا:

المعاملة (الرقم التعريفي ، المنتج ، العميل ، السنة ، الشهر ، المبلغ):

  • تحقق من أن المنتج موجود في قاعدة البيانات
  • التحقق من وجود العميل في قاعدة البيانات

كيف يمكنني جعل هذا النهج؟

شكرا لكم!

1 إجابة

0

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

class Transaction(models.Model):
    transaction_id = models.AutoField(primary_key=True)
    transaction_product = models.ForeignKey('Product', on_delete=models.CASCADE, blank=True, null=False)
    transaction_customer = models.ForeignKey('Customer', on_delete=models.CASCADE, blank=True, null=False)
    transaction_year = models.CharField(max_length=32, null=True, blank=True, db_index=True)
    transaction_month = models.CharField(max_length=32, null=True, blank=True, db_index=True)
    ...
    ...

إذا كنت بحاجة إلى إضافة نوع المعاملة على صفحة مسؤول الويب
أعتقد أنه يمكنك جعل نموذج TransactionExtra له علاقة بأكثر من 2 مع المعاملات. مثله.

class Transaction(models.Model):
    transaction_id = models.AutoField(primary_key=True)
    transaction_extra = models.ManyToManyField('TransactionExtra', db_index=True)

class TransactionExtra(models.Model):
    transaction_extra_id = models.AutoField(primary_key=True)
    transaction_extra_name = models.CharField(max_length=32, index=True)
    transaction_extra_value = models.CharField(max_length=512)
:مؤلف
فوق
قائمة طعام