مبتدئ: Django: إضافة نتائج محسوبة إلى QuerySet قبل المرور إلى القالب

StackOverflow https://stackoverflow.com/questions/1483424

  •  18-09-2019
  •  | 
  •  

سؤال

يومي يومين من حياتي الجديدة مع Django، يرجى إظهار بساطل سؤالي.

لدي جدول DB موجود (الوصول للقراءة فقط) التي قمت بعرضها بنجاح محتويات على صفحة ويب باستخدام عناوين URL، وجهات النظر، الطرز وكل تلك الأشياء الجيدة.

التحدي الذي لدي هو الجدول لا يحتوي على جميع المعلومات التي أحتاجها لعرضها. يحتوي الجدول على نتائج اختبار مع الأعمدة، Sampletime، SampleValue، Sampleresult. أحتاج إلى عرض بيانات مختلفة بناء على ما قمت بحسابه من تلك الأعمدة.

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

ما هو المعرف الذي ترغب في المرور إلى القالب هو،

  • jssampletime (كائن Datetime Sampletime تم تحويله إلى JavaScript Epoch MS)
  • يؤدي (مبلغ المتداول + - من SampleValue بناء على ما إذا كان Sampleresult جيدا أو سيئا)

أنا بخير مع إنشاء JSSampleTime والفعلات باستخدام وظائف DEF. أفترض أنني أود إضافة هذه الوظائف إلى وجهات النظر.

أعتقد أن ما أحتاج إليه في التأكيد على Queryset في المشاهدات .py وتخزين النتائج في قائمة القواميس التي أبعثها إلى القالب. شيء من هذا القبيل (رمز غير اختبار).

وجهات النظر الاجتماعات

# views.py
# Sudo code to assit in asking the question
from django.shortcuts import render_to_response
from thing.reporter.models import Samples

def _datetime_to_js(sampletime):
    #.. date conversion epoch magic
    return jsd_result

def _rolling_sum(samplevalue,sampleresult):
    #.. summing magic
    return sum_result

def dumptable(request): # The def that is called by urls.py
    object_list = Samples.objects.all()

    list_for_template = []
    for row in object_list:
        jssampletime = _datetime_to_js(row.sampletime)
        resultvalue  = _rolling_sum(row.samplevalue,row.sampleresult) 
        list_for_template.append({'jssampletime':jssampletime,'resultvalue':resultvalue})   

    return render_to_response('tabledump.html', {'result_list': list_for_template})

tabledump.html.

# tabledump.html template
{% block content %}
    <h2>Results dumped to page for testing</h2>
    <ul>
    <table>
    {% for result in result_list %}
        <tr>
        <td>{{ result.jssampletime }}</td>
        <td>{{ result.resultvalue }}</td>
        </tr>
    {% endfor %}
    </table>
    </ul>
{% endblock %}

أعتقد أن هذا سيعمل ولكن لست متأكدا مما إذا كانت طريقة Django MVC.

هل صحيح أنني،

  • احسب النتيجة التي أحتاج إليها في وجهات النظر. بالتقسيط على نتيجة للاستعلام؟
  • تمر ناتي عن قالب كقائمة من DICT (هو استعلام أكثر من ذلك)؟

أعتقد أنني أبحث عن بعض اتجاه ونصائح التعليمات البرمجية. هل أنا على الطريق الصحيح؟ هل هناك طريقة أفضل ؟

هل كانت مفيدة؟

المحلول

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

على سبيل المثال

class MyModel(models.Model):
    model_field = models.CharField(max_length=255)

    @property
    def calculated_field(self):
        return self._do_calculation(self.model_field)

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

for row in object_list:
    # update some variable we want to use in the template
    row.newly_added_field = run_calculation(row, somevariable)

يمكن بعد ذلك الوصول إلى كل من هذه في القالب:

{% for result in result_list %}
    <tr>
    <!-- some stuff that displays the model directly -->
    <td>{{ result.calculated_field}}</td>
    <td>{{ result.newly_added_field}}</td>
    </tr>
{% endfor %}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top