2012-02-28 4 views
0

すべてのクライアントの最新のタスクレコードであるタスクオブジェクトのリストを作成します。次に、このリストを使用して、タスクリスト内の各オブジェクトの辞書リスト(クライアント、いくつかのtask_values、および日付を指定する)を作成します。この時Djangoを使用して一意のFKと最新のタイムスタンプを持つオブジェクトのリストを作成

class Client(models.Model): 
    user_name = models.CharField 

class Task(models.Model): 
    client = models.ForeignKey('Client',) 
    task_type = models.ForeignKey('Task_Type',) 
    timestamp = models.DateTimeField(default = datetime.now(), blank = True, null = True,) 

class Task_Type(models.Model): 
    name = models.CharField(
         max_length = namelen, 
         unique = True, 
         ) 

class Task_Value(models.Model): 
    value_char = models.TextField 
    task = models.ForeignKey('Task',) 
    field = models.ForeignKey('Task_Field') 

私の試みは、このようなものを見て:私はこのようになりますモデル持って

task_objs=Task.objects.filter(client__in=client_list, task_type=1).distinct().order_by('-timestamp') 
task_dict = [{task_obj[x].client.pk:task_obj[x].task_value_set.get(field__name__exact='ABC').value_char} for x in range (0,len(client_list),1)] 

をしかし、これは私のすべてのクライアントおよびタイムスタンプの組み合わせ(そのすべてのレコード)のための明確な記録を提供します。だから2つの質問、どのように私はクライアントの最新のレコードは、各クライアントの個別のレコードを取得するのですか? 2つは、私がtask_dictを取得するために説明したものよりも全体的に優れたメソッドですか?

+0

私は 'Task.task_type'の下に' ForeginKey'の代わりに 'ForeignKey'と' Task_Type.name'の2つのタイプミスがあります。 'CharField'は'(some_num) (それを別々にインスタンス化しない限り)。これらがコード内に存在する場合は、最初に修正してから、再実行してみてください。 – Edwin

+1

あなたは 'values'を見ましたか? https://docs.djangoproject.com/en/dev/ref/models/querysets/#values辞書のクエリセットを返します。 – dm03514

+0

値の制限は、モデルに帰属する値に制限されていることです。結果の1つとして別のテーブルを照会することはできません。私がこれに間違っていると、どう見えるでしょうか? –

答えて

0

値とのリレーションシップに関するAgDudeの提案を使用する。クエリを一歩前に戻して、Tasxk_Valueモデルにクエリを実行し、フィルタコマンドの関係にまたがってタスクをフィルタリングします。次に、values_listとのリレーションシップをスパニングします。 queryset.value_list( 'pk'、 'task__timestamp')、別のqueryset.values_list( 'pk'、 'task__client')、および別のqueryset.values_list( 'pk'、 'value_char')は、 )。次に、dict()を使用して、各値リストを辞書に変換し、必要な値を解析するために使用することができます。

最新のクライアントとvalue_charだけが必要な場合は、values_list( 'task__client'、 'value_char')とdict()が1つ必要です。ただし、クエリーセットは、以前に格納された値を上書きするため、古いものから新しいものに順序付けする必要があります。

1

これを参照してくださいquestion。私は最初の答えを提案し、カスタムメソッド(2番目の答え)は大規模なクエリセットのDBに多くの負荷を追加します。

関連する問題