【问题标题】:How to fetch data from another app Django如何从另一个应用程序 Django 获取数据
【发布时间】:2021-05-29 13:19:22
【问题描述】:

我正在使用 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 }}

【问题讨论】:

    标签: python django mongoengine


    【解决方案1】:

    您将原样返回问题文件。您应该做的是,获取与问题 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

    【讨论】:

    • 我得到一个空列表。
    • 代码在 EDIT 1 中
    • 一切正常。数据库中有一个程序。感谢您的帮助
    猜你喜欢
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    相关资源
    最近更新 更多