Django - تعديل قيمة الحقل بعد كل استعلام

0

أنا جديد إلى حد ما على جانغو قادمًا من خلفية Laravel. أود تعديل قيمة حقل في كل مرة أستعلم عنها. على سبيل المثال ، في كل مرة تقوم فيها بالاستعلام عن الاسم الأول @ المستخدم ، فإنك تُعيد الاسم الأول الكبير يُعرف هذا في Laravel بـ Accessors ولكن بشكل ثانوي يمتلك Accessors معنى مختلفًا في Django. بالنسبة لحالتي ، لدي جدول قيم مفتاح يسمى Meta أين ال value يمكن أن يكون الحقل من أي نوع:

class Meta(models.Model):
    key = models.CharField(max_length=30)
    value = models.TextField()
    model = models.ForeignKey('Model', on_delete=models.CASCADE)

وعند الحصول على القيمة Meta.objects.get(key='foo') ، وأود أن العودة ast.literal_eval(value) لتحويل تعبير السلسلة إلى النوع المناسب. قمت ببعض البحث ووجدت ما يلي فقط:

  • قم بإنشاء حقل مخصص.
  • استعمال get_foo_display(self) ولكن هذا يعمل فقط لـ ChoiceField بقدر ما فهمت.

ما هو الخيار الأفضل لتطبيق هذه الوظيفة في كل مرة أستعلم فيها value تصفية حسب key

2 الاجابة

2
افضل جواب

يمكنك استخدام حقل مخصص ، ولكن أسهل شيء هنا هو استخدام خاصية.

class Meta(models.Model):
    value = models.TextField()

    @property
    def converted_value(self):
        return ast.literal_eval(self.value) 

الآن يمكنك الوصول my_meta.converted_value كلما احتجت تلك القيمة المحولة.

:مؤلف
1
افضل جواب

يعدproperty نهجًا جيدًا ، ولكن إذا كنت ستتمكن من الوصول إلى الكثير من الوقت ast.literal_eval والمعالجة مكلفة ، فيمكنك تجاوز طريقة الحفظ:

def __init__(self, *args, **kwargs):                                         
    super(Meta, self).__init__(*args, **kwargs)                         
    self.__original_value = self.value

def save(self, **kwargs):
    if self.__original_value != self.value:
        self.value = ast.literal_eval(self.value)
    super(Meta, self).save()

ستختار الحرف القيمة قبل التحديث

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام