0

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

Base_Activity:

topics = models.ManyToManyField(Topic)
... some others

ユーザー_アクティビティ:

user = models.ForeignKey(settings.AUTH_USER_MODEL)
activity = models.ForeignKey(Base_Activity)
is_archived = models.BooleanField(default=False)

ここで、トピック XBase_activityのすべての行を選択し、user =*current_user* およびis_archived = Trueに一致する行がある行を除外するクエリを実行したいと考えています。User_Activity


リレーションシップを後方にたどる方法についてDjangoのドキュメントを読んだことBase_ActivityがありますUser_Activity. ただし、Django コンソールでこのメソッドをテストしても機能しません。

a = Base_Activity.objects.filter(topics__slug = topic)
a.user_activity_set.all()
AttributeError: 'InheritanceQuerySet' object has no attribute 'user_activity_set'

質問:クエリを実行する最善の方法は何ですか? これが実際に ForeignKey を逆方向にたどることによるものである場合、何が間違っているのでしょうか?

4

2 に答える 2

0
a = Base_Activity.objects.filter(topics__slug = topic)

これは、モデル インスタンスではなく、QuerySet インスタンスを返します。それを反復処理するか、リストから 1 つだけ取得する必要があります。

activities = Base_Activity.objects.filter(topics__slug=topic)
activities[0].user_activity_set.all()

あなたの場合、1 つのクエリですべての作業を行うことができます。

activities = Base_Activity.objects.filter(topics__slug=topic).exclude(user_activity__user=user, user_activity__is_archived=True)
于 2013-10-14T17:22:32.690 に答える