سؤال

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

SELECT b.created_on, SUM(a.vote)
FROM votes a JOIN votes b ON a.created_on <= b.created_on
WHERE a.object_id = 1
GROUP BY 1

وأين الأصوات هو جدول، object_id هو كثافة العمليات التي تحدث عدة مرات (المفتاح الخارجي - على الرغم من هذا لا يهم هنا)، وcreated_on وهو التاريخ والوقت

وFWIW، يسمح هذا الاستعلام واحد للحصول على درجة في أي وقت في الماضي من خلال تلخيص جميع الأصوات السابقة على أن object_id.

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

المحلول

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

هل أنت متأكد من أن يعمل الاستعلام؟ يبدو أنك في عداد المفقودين الاختيار التي b.object_id هو 1.

ويجب أن تعمل هذا الرمز، لكنه أكثر من سطر واحد وليس الكفاءة.

from django.db.models import Sum

v_list = votes.objects.filter(object__id=1)

for v in v_list:
    v.previous_score = votes.objects.filter(object__id=1, created_on__lte=v.created_on).aggregate(Sum('vote'))["vote__sum"]

والتجميع لا تتوفر إلا في الجذع، لذلك قد تحتاج إلى تحديث جانغو بك تثبيت قبل أن تتمكن من القيام بذلك.

نصائح أخرى

وتجميع ليست القضية. المشكلة هنا هي أن ORM بفك ببساطة لا تفعل ينضم على أي شيء ليس ForeignKey، AFAIK.

وهذا هو ما أنا باستخدام الآن. ومن المفارقات، هو مزود كسر ولكن هذا هو جوهر ما يلي:

    def get_score_over_time(self, obj):
    """
    Get a dictionary containing the score and number of votes 
    at all times historically
    """
    import pdb; pdb.set_trace();
    ctype = ContentType.objects.get_for_model(obj)
    try:
        query = """SELECT b.created_on, SUM(a.vote)
                        FROM %s a JOIN %s b 
                        ON a.created_on <= b.created_on
                        WHERE a.object_id = %s
                        AND a.content_type_id = %s
                        GROUP BY 1""" % (
            connection.ops.quote_name(self.model._meta.db_table),
            connection.ops.quote_name(self.model._meta.db_table),
            1,
            ctype.id,
            )
        cursor = connection.cursor()
        cursor.execute(query)
        result_list = []
        for row in cursor.fetchall():
            result_list.append(row)
    except models.ObjectDoesNotExist:
        result_list = None
    return result_list
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top