如何从另一个应用程序 Django 获取数据

How to fetch data from another app Django

我正在使用 Django 和 MongoEngine 创建一个测验项目。多项选择题和测验是两个独立的应用程序。我想在基于 m_id 的测验中获取多项选择(每个多项选择的唯一编号)。我是初学者,需要一点帮助。我怎样才能实现这个
MCQS 模型

from django_mongoengine import Document, EmbeddedDocument, fields
class multichoice(Document):
    m_id = fields.IntField(min_value=1, verbose_name='MCQ Id')
    m_title = fields.StringField(primary_key=True, max_length=255, verbose_name='Title')
    m_question = fields.StringField(verbose_name='Question')
    m_alternatives = fields.ListField(fields.StringField(),verbose_name='Alternatives')
    
    def __str__(self):
        return self.m_title

测验模型

from django_mongoengine import Document, EmbeddedDocument, fields
from mcqs.models import *
class quiz(Document):
    q_id = fields.IntField(min_value=1, verbose_name='Quiz ID')
    q_title = fields.StringField(primary_key=True, max_length=255, verbose_name='Title')
    q_s_description = fields.StringField(max_length=255, verbose_name='Description')
    q_questions = fields.ListField(fields.IntField(), verbose_name='Question Numbers', blank=True)

    def __str__(self):
        return self.q_title

MCQ 观看次数

def view_multichoice(request, m_id):
    get_md = multichoice.objects(m_question_number = m_id)
    return render(request, 'mcqs/mcq.html', {'get_md':get_md})

测验浏览量

def view_quiz(request, q_id):
    get_q = quiz.objects(q_id = q_id)
    return render(request, 'quiz/quiz.html', {'get_q':get_q})

当前结果 预期结果

编辑 1
测验浏览量

from django.shortcuts import render
from django.http import HttpResponse
from .models import *
from mcqs.models import *
def view_quiz(request, q_id):

    quiz_object = quiz.objects(q_id=q_id)[0]
    multichoice_objects = [multichoice.objects(m_id=id) for id in quiz_object.q_questions]
    get_q = [objects[0].m_question for objects in multichoice_objects if objects]
    return render(request, 'quiz/quiz.html', {'get_q':get_q})

测验模板

{{ get_q }}

您将按原样返回问题文件。你应该做的是,获取与问题 id 对应的多选文档,然后从每个文档中获取问题字段。

将测验视图中的第二行更改为:

# Get the question document corresponding to given id
# objects method returns a list. Get the first one out of it. 
# Here, I've assumed there's exactly 1 quiz document per ID. Handle the edge cases

quiz_object = quiz.objects(q_id = q_id)[0] 

# Get the multiple choice documents corresponding to the ids in q_questions list
# Remember that objects method returns a list. Hence this is a list of lists
 
multichoice_objects = [multichoice.objects(m_id=id) for id in quiz_object.q_questions]

# Get the actual questions from the multichoice documents

get_q = [objects[0].m_question for objects in multichoice_objects if objects]

理想情况下,您应该将多项选择作为 EmbeddedDocument,并将测验模型中的 q_questions 字段作为 EmbeddedDocumentListField。但是这里的缺点是,您不能独立查询 EmbeddedDocuments。所以你将无法做到 multichoice.objects(m_question_number=m_id).

您可以阅读有关 EmbeddedDocuments 的更多信息here