2016-10-25 3 views
0

私の質問は簡単です:Djangoアプリでは、私はテーブルUsersとテーブルStatusUpdatesを持っています。 StatusUpdatesテーブルでは、私はのUsersを指す外来キーであるカラムを持っています。私のようなものを表現検索を行うことができます方法:Django:2番目のテーブルのプロパティに基づいて内部結合をフィルタリングする方法は?

users.filter(latest_status_update.text__contains='Hello') 

編集:

が明確に私の欠如を許しなさい。私が作成したいクエリは、「最新の状況更新に 'hello'というテキストが含まれているすべてのユーザーを教えてください」というようなものです。 Djangoのコードでは、私は(本当に非効率的で醜いです)次の操作を行います:

hello_users = [] 
for user in User.objects.all(): 
    latest_status_update = StatusUpdate.objects.filter(user=user).order_by('-creation_date')[0] 
    if latest_status_update.text.contains('Hello'): 
    hello_users.append(user) 

return hello_users 

編集2:

私はすでに解決策を見つけたが、私はあるここでは、頼まれたので、私のモデルの重要な部分:

class User(models.Model): 
    ... 

class StatusUpdate(models.Model): 
    user = models.ForeignKey(User) 
    text = models.CharField(max_length=140) 
    creation_date = models.DateTimeField(auto_now_add=True, editable=False) 
    .... 

答えて

2

さて、私は、私はそれを得たと思う:詳細情報については

from django.db.models import Max, F 

User.objects\ 
    .annotate(latest_status_update_id=Max('statusupdate__id'))\ 
    .filter(
    statusupdate__id=F('latest_status_update_id'), 
    statusupdate__text__icontains='hello' 
) 

this section of the Django documentationを参照してください。

ご注意:を私は少し私の戦略を変更し、最高のIDは、最新のアップデートを意味戦略に落ち着いてしまいました。これは、ユーザーが同じ時間に2つの更新を投稿してクエリを破損する可能性があることを認識したためです。

0

ない私は理解してください、あなたは

StatusUpdates.objects.select_related("user").filter(text__contains = "hello").order_by("-updated").first() 
ような何かをしようとしている

これは、テキストフィールドに "Hello"を含む最後に変更されたStatusUpdateを返します(最後に変更された時刻を格納するupdatedというフィールドがある場合)。その文字列がStatusUpdateに含まれていない場合、Noneを返します。

が次にあなたが

latest = StatusUpdates.objects.select_related("user").filter(text__contains = "hello").order_by("-updated").first() 
#then if you needed the user too 
if latest is not None: 
    user = latest.user #which does not call the DB again since you selected related` 

を行うことができ、これはあなたが必要なもの、詳細(モデル)を提供し、あなたの必要性を明確にしてください

+0

あなたの答えをありがとう。質問をもっと明確に更新しました。 – daveslab

0
latest_status_updates = filter(lambda x: x.text.contains('hello'), 
    [ 
     user.statusupdates_set.order_by('-creation_date').first() 
     for user in User.objects.all() 
    ] 
) 
users = list(set([status_update.user for status_update in latest_status_updates])) 

EDITれていない場合: 今、私が最初にすべての取得します各ユーザーの最新の状態更新をリストにして、StatusUpdateクラスのテキストフィールドでフィルタリングします。 2行目では、フィルタリングされたステータス更新からユーザーを抽出して、ユーザーの一意のリストを生成します。

こちらがお役に立てば幸いです。

+0

あなたのクエリでは、**最新のステータスアップデート**でユーザーごと**を検索したいという事実は考慮されていません。さらに、ユーザーのリストは一意ではありません。 – daveslab

+0

変更点を確認し、問題がある場合はお知らせください:) –

関連する問題