2016-04-09 7 views
0

私のデータベースには私のいくつかのエラーが保存されているので、ビュー間で簡単にそれらを送ることができます。ここに私のmodels.pyです:Djangoで辞書にオブジェクトを格納する

class Errors(models.Model): 
    error_number = models.IntegerField(primary_key=True) 
    error_message = models.CharField(max_length=45) 
    status = models.BooleanField(default=0) 
    datetime = models.DateTimeField(auto_now=True) 

私は後にテンプレートに渡すことができるように辞書にエラーを載せていきたいと思います。ステータスがTrue/1の場合にのみこれを実行したいと思っています。

私はErrors.objects.all()を呼び出している間にnewtworkをフラッディングしているので、これは悪いプログラムだと思うが、forループを実装する方法がわからない。

同じエラーのすべてのデータ、つまりエラー番号、エラーメッセージ、および日時をテンプレートにグループ化して表示するにはどうすればいいですか? (P.S.私は、SOのコードを尋ねることは、no-noであることを認識しています。これは、便利なサイトや例を共有しようとする人にとってはオプションです)。

例(私がmoemntで使っているように)は、何も印刷しません。

<ul> 
{% for key, value in err.iteritems %} 
    <li>{{key}: {{value}}</li> 
{% endfor %} 
</ul> 

答えて

1

あなたが共有しているコードについては、多くのことが言えます。

まず、なぜこの構造の辞書が本当に必要なのかわかりません。あなたの希望する出力は何ですか?


第二に、このコード片が魚である:

for warning in warnings: 
    if Errors.objects.filter(status='1'): 
     .... 

statusBooleanFieldあります。ブール値でフィルタリングする必要があります。一方、反復でデータベース全体をフィルタリングする必要があるのはなぜですか?このようなことを意味しましたか?

for warning in warnings: 
    if warning.status: 
     ... 

もう一つは、あなたが選んだ命名です。あなたのモデルに特異な名前を付ける方が良い方法です。 Errorsの代わりにErrorを使用してください。


本当にこのようなことを行う必要がある場合は、 collections.defaultdictを使用することをお勧めします。 listのキーを動的に追加することができます。

from collections import defaultdict 
err = defaultdict(list) 

for warning in warnings: 
    if warning.status: 
     err['error_numbers'].append(warning.error_number) 
     err['error_messages'].append(warning.error_message) 
     err['datetime'].append(warning.datetime) 

もう一度、あなたは何かハッキーを達成しようとしているようです。おそらくあなたのニーズとアプローチを考え直すべきです。


これは、すべてのキーと各キーのリストを印刷する必要があります。

<ul> 
{% for key, values in err.iteritems %} 
<li>{{key}}: #edited here, 1 "}" was missing 
    {% for value in values %}{{value}}{% endfor %} 
</li> 
{% endfor %} 
</ul> 
+0

あなたが名前を挙げたものの多くは、自分のコードについて考えさせました。私はそのほとんどを修正しましたが、まだサイトに送信されたデータはありません。私はソースをチェックし、これらのデータがあるはずの空白だった。 それ以外の場合、私はBooleanFieldを使用していましたので、私は "warning.status"を使用することができましたが、Charfieldを使用して、それに基づいて反復したいのですが?例えば:if(warning.error_message__startswith = 'Device')..これは良いif文ですか? – narn

+1

'警告の場合。error_message.startswith( 'Device'): 'は動作します。あるいは、最初にそれらをフィルタリングすることができます: 'Error.objects.filter(error_message__startswith = 'デバイス')'。または、あなたの場合: 'Error.objects.filter(status = True)'。ところで、代わりに 'err.items'を使ってみてください。これはPythonではなく、Djangoのテンプレート構文です。 – username

+0

ありがとう、それに応じて私のコードを微調整します。残念ながら 'err.items'は問題を解決しませんでした。どのように私はこれをデバッグできますか? (この条件を満たすデータベースには、正確に1行ありますので、何かを出力する必要があります)。 – narn

関連する問題