Django查询包含外部属性

时间:2013-01-26 07:06:20

标签: django django-queryset

我有这个模特课:

class question(models.Model):
    id = models.CharField(max_length=64, primary_key=True,null=False)
    paper_id = models.ForeignKey(paper,null=True)
    question_no = models.SmallIntegerField('question_no',max_length=6,null=True)
    content = models.TextField('content',null=False)
    topic_id = models.ForeignKey(topic,null=True)
    subtopic_id = models.ForeignKey(subtopic,null=True)
    std_answer = models.CharField(max_length=128,null=True)
    marks = models.IntegerField('marks',max_length=2,null=True)
    input = models.CharField(max_length=512,null=True,default=None)
    type_answer = models.CharField(max_length=512,null=True)
    type = models.CharField(max_length=512,null=True,default=None)

    def __str__(self):
        return str(self.id)

我需要列出它的所有属性,包括Topic.Title,Subtopic.Title和Paper.Title,它们分别位于外来对象Topic,Subtopic,Paper中。我怎么能在一个查询中这样做?

2 个答案:

答案 0 :(得分:0)

要根据外键属性进行过滤,请使用FK模型名称后跟双下划线,然后使用属性名称:

query = question.objects.filter(topic_id__title="foobar")

要轻松创建复杂查询,请使用Q objects

答案 1 :(得分:0)

你的models.py必须是这样的:例如:

class Topic(models.Model):
    .....

class SubTopic(models.Model)
    topic = models.ForeignKey(Topic)
    .....

class question(models.Model):
   question_no = models.SmallIntegerField('question_no',max_length=6,null=True)
   content = models.TextField('content',null=False)
   subtopic = models.ForeignKey(Subtopic)
   .....

你不必放id,因为django会为你创建它。

views.py

def page(request):
return render(request, 'page.html', {
    'topics' : topic.objects.filter()
}

if you want to get by id

def page(request, id):
    topics = topic.objects.get(pk=id)
return render(request, 'page.html', {
    'topics' : topic
}

您的模型类不正确。你不必放很多外键。一个外键就可以了。

{% for topic in topics %}
    {{topic.title}}

    {% for subtopic in topic.subtopics  %}
        {{subtopic.title}}

        {% for question in subtopic.questions %}
            ............
        {% endfor %} 
    {% endfor %}
{% endfor %}