0

多くの会話ができるContactクラスがあります。ただし、各会話は1つの連絡先に属することができます。つまり、1対多の関係です。

class Contact(models.Model):
    first_name          = models.CharField()
    last_name           = models.CharField()   

class Conversation(models.Model):
    contact             = models.ForeignKey(Contact)
    notes               = models.TextField()

    def __unicode__(self):
        return self.notes

ここで、連絡先をテンプレートに渡すときに、連絡先の最後の会話を表示する1つのフィールドが必要です。

contacts= profile.company.contact_set.all()[:10]
calls = []

for c in contacts:
    calls.append(max(c.conversation_set.all()))

そして、私はこれらを次のように渡します:

vars = {'contacts' : contacts, 'calls': calls}
variables = RequestContext(request, vars)
return render_to_response('main_page.html', variables)

テンプレートで私はこの魔法を思いついた:

{% for idx, val in contacts %}
                    <tr>
                        <td>...
                        </td>
                        <td>    
                            {% if calls %}  
                                 {{ calls.idx }} 
                            {% endif %}</td>
                    </tr>
{% endfor %}

これは、呼び出しに対して何も表示しません。しかし、calls.idxをcalls.0に置き換えると、最初のものが表示されます。

私は何が間違っているのですか?それがおそらくそれよりはるかに簡単にできるという事実に加えて。:)私はそれを行うためのより良い方法を開いています。

4

2 に答える 2

2

テンプレート言語ではこの種の間接的なルックアップを行うことはできません -calls.idxは常に にidx属する属性を参照しますcalls

ただし、呼び出し値を contact オブジェクトに直接追加することをお勧めします。Python オブジェクトは動的であるため、好きなように注釈を付けることができることを忘れないでください。

for c in contacts:
    c.max_call = max(c.conversation_set.all())

余談ですが、それはmax本当に機能しますか?何に基づいて比較を行うのかわかりません。get_latest_by別の方法は、会話モデルで定義することです。このループを完全に回避し、ループを{{ contact.conversation_set.get_latest }}介して連絡先ごとにテンプレートを呼び出すだけです。

(これはまだかなり非効率的であることに注意してください。一度に最大の会話のセット全体を取得する方法はいくつかありますが、今のところはそれで十分です。)

于 2012-07-09T12:10:35.960 に答える
0
class Contact(models.Model):
    # your code here

   @property
   def last_conversation(self):
       try:
           return self.conversation_set.order_by("-some_date_or_order_field")[0]
       except IndexError:
           return None

次に、ビューでこれを気にする必要はなく、テンプレートで「c.last_contact」を呼び出すだけです。

于 2012-07-09T12:14:59.937 に答える