簡體   English   中英

過濾Django模板中的queryset

[英]Filter queryset in django templates

我有一個如下模型:

class Venture(models.Model):
    name = models.CharField(_('name'), max_length=255)
    created = models.DateTimeField(editable=False)
    modified = models.DateTimeField()


class QuestionSet(models.Model):
    title = models.CharField(_(u'title'), max_length=100)


class Question(models.Model):
    title = models.CharField(_(u'title'), max_length=255)
    qset = models.ForeignKey(QuestionSet, related_name='questions')


class Answer(models.Model):
    question = models.ForeignKey(Question, related_name='answers')
    responder = models.ForeignKey(User)
    venture = models.ForeignKey(Venture, related_name='answers')
    text = models.TextField(_(u'answer'), blank=True, null=True)
    timestamp = models.DateTimeField(auto_now_add=True)

對於所有用戶,存在一組預定義的問題。 對於每個企業,我為每個QuestionSet有一個頁面,其中列出了該集合中的問題,然后按如下所示循環遍歷這些問題:

<div> {{ venture.name }} </div>
{% for question in qset.questions.all %}
  <div class="qset-question control-group">
    {{ question.title }}
    {# How do I access the answer for the current venture? #}
  </div>
{% endfor %}

問題是為當前企業獲得該問題答案的最佳方法是什么。 我想在這里輸出有關答案的一些信息。

任何幫助表示贊賞。

我通過創建自定義模板年齡解決了該問題。 這是代碼:

@register.assignment_tag
def question_answer(venture, question):
    answers = question.answers.filter(venture=venture)
    return answers[0] if answers else None

然后像這樣使用它:

{% question_answer venture question as answer %}
{{ answer }}

最簡單的解決方案是針對給定的“冒險”對“答案”進行選擇,這將為您提供“答案”列表。 然后,您可以使用它來獲取有關合資企業的所有問題。

所以像這樣:

ans = Answer.objects.filter(venture=v)

編輯::

根據您所說的,您需要重新設計模型。 我可以看到很多不足之處(我會告訴你)。 否則,您需要執行多個查詢,並為您的視圖提供多個查詢集。

那這樣的東西呢?

models.py

from django.db import models
from django.contrib.auth import get_user_model
from django.utils.translation import ugettext as _

User = get_user_model()

class Venture(models.Model):
    name = models.CharField(_('name'), max_length=255)
    created = models.DateTimeField(auto_now_add=True, editable=False)
    modified = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

class Question(models.Model):
    title = models.CharField(_(u'title'), max_length=255)

    def __str__(self):
        return self.title

class VentureQuestion(models.Model):
    venture = models.ForeignKey('Venture', related_name='questions')
    question = models.ForeignKey('Question', related_name='venture_questions')

    def __str__(self):
        return "{}: {}".format(self.venture, self.question)

class Answer(models.Model):
    question = models.ForeignKey('VentureQuestion', related_name='answers')
    responder = models.ForeignKey(User, related_name='answers')
    text = models.TextField(_(u'answer'), blank=True, null=True)
    timestamp = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return "{}: {}".format(self.responder.username, self.text)

管理員

from django.contrib import admin

from example.models import Venture, VentureQuestion, Question, Answer


class AnswerInline(admin.StackedInline):
    model = Answer
    extra = 0


class VentureQuestionAdmin(admin.ModelAdmin):
    inlines = [AnswerInline]


admin.site.register(Venture)
admin.site.register(VentureQuestion, VentureQuestionAdmin)
admin.site.register(Question)
admin.site.register(Answer)

這樣,您就可以為每個與Venture相關的Question找到答案...(聽起來這至少是您要尋找的功能...)

>>> from example.models import Venture
>>> ventures = Venture.objects.all()
>>> for venture in ventures:
...     for venture_question in venture.questions.all():
...         venture_question.question.title
...
u'What is this?'
u'How does this work?'
u'Does this even work?'
>>> for venture in ventures:
...     for venture_question in venture.questions.all():
...         venture_question.question.title, [answer.text for answer in venture_question.answers.all()]
...         
(u'What is this?', [])
(u'How does this work?', [u'It just does!'])
(u'Does this even work?', [u'Sure it does...', u'I think so'])

你可以有另一種Venture是使用相同的Question ,但有不同的Answers

>>> venture = Venture.objects.get(name='Another Venture')
>>> for venture_question in venture.questions.all():
...     venture_question.question.title, [answer.text for answer in venture_question.answers.all()]
...     
(u'What is this?', [])

在新的VentureQuestion添加Answer

>>> venture = Venture.objects.get(name='Another Venture')
>>> for venture_question in venture.questions.all():
...     venture_question.question.title, [answer.text for answer in venture_question.answers.all()]
...     
(u'What is this?', [u"It's another venture with the same question and it's own answers..."])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM