7

私はPythonとDjangoを初めて使用するので、しばらくお待ちください。

私は次のモデルを持っています:

class User(models.Model):
   name = models.CharField(max_length = 50)
   ...

class Post(models.Model):
   userBy = models.ForeignKey(User, related_name='post_user')
   userWall = models.ForeignKey(User, related_name='receive_user')
   timestamp = models.DateTimeField()
   post = models.TextField()

class Friend(models.Model):
   user1 = models.ForeignKey(User, related_name='request_user')
   user2 = models.ForeignKey(User, related_name='accept_user')
   isApproved = models.BooleanField()
   class Meta:
      unique_together = (('user1', 'user2'), )

これがDjangoでそれを処理するための最良/最も簡単な方法ではないかもしれないことを私は知っていますが、私はそれをこのように学びました、そして私はそれをこのように保ちたいです。

今、私がやりたいのは、1人の人とその友達からすべての投稿を取得することです。今の問題は、Djangoフィルターでそれをどのように行うかです。

SQLでは次のようになります。

SELECT p.* FORM Post p, Friend f 
WHERE p.userBy=THEUSER OR (
    (f.user1=THEUSER AND f.user2=p.userBy) OR
    (f.user2=THEUSER AND f.user1=p.userBy)
)

正確さを保証するものではなく、私が探している結果のアイデアを与えるためだけに。

4

2 に答える 2

8
from django.db.models import Q

Post.objects.filter( \
    Q(userBy=some_user) | \
    Q(userBy__accept_user__user1=some_user) | \
    Q(userBy__request_user__user2=some_user)).distinct()

アップデート

申し訳ありませんが、それは私のせいでした。私はあなたの価値観に注意を払いませんでしたrelated_name。上記の更新されたコードを参照してください。userBy__accept_useroruserBy__request_userを単独で使用Friendすると、 と比較できない参照になるため、機能しませんUser。ここで行っているのは、逆の関係Friendをたどり、そこに到達したら、友達リクエストののユーザーが問題のユーザーであるかどうかを確認することです。

これは、逆の関係を適切に記述することの重要性も示しています。多くの人があなたがここで犯したのと同じ間違いを犯し、FK を ( ) にrelated_name作成しているモデルにちなんで名前を付けます。簡単に言えば、関連する名前は次のようなものとしてより意味があります:および.UserFriendfriend_requestsaccepted_friends

于 2012-10-12T20:56:31.787 に答える
0
(with User u)
friends_u1 = Friend.objects.filter(user1 = u).getlist('user2_id', flat=True)
friends_u2 = Friend.objects.filter(user2 = u).getlist('user1_id', flat=True)
friends_and_user = friends_u1+friends_u2+u.id

Post.objects.filter(userBy__id__in = friends_and_user)
于 2012-10-12T20:54:41.947 に答える