Django获取所有相关模型的记录

8

我有三个模型用于待办事项应用程序:

class Topic(models.model)
    user = models.ForeignKey(UserProfile)
    lists = models.ManyToManyField(List)

class List(models.model)
    activities = models.ManyToManyField(Activity)

class Activity(models.model)
    activity = models.CharField(max_length=250)

这在用户选择主题后选择列表(子分类),显示该列表上的所有活动时是有意义的。但是,如何有效地查询以下内容呢?
- 用户X的所有活动(无论主题或列表) - 用户X的主题X的所有活动(无论列表)
我需要在查询中使用`select_related()`,然后循环遍历相关对象吗?还是有更高效的方法而不需要循环?(或者我应该更改我的模型?)
2个回答

12
使用双下划线语法查询关系。
用户的所有活动:
Activity.objects.filter(list__topic__user=my_user)

用户在某个主题下的所有活动:

Activity.objects.filter(list__topic=my_topic)

(请注意,目前话题仅适用于单个用户。不确定这是否是您的意思:您描述了一个用户选择一个话题,在此处无法发生。潜在地,从话题到用户资料的链接应该改为另一种方式或采用多对多关系。)


这是一种反向关系。 - Daniel Roseman
为什么这对于反向关系起作用?我不应该使用类似list_set__topic的东西吗?(我只是不知道这种可能性) - JacobF
关于你对这个主题的评论,我已经知道了。我为演示目的简化了一下。 - JacobF
@jvannistelrooy 请见文档:"要引用“反向”关系,只需使用模型的小写名称即可。" - Daniel Roseman

1
给它们相关的名称(更容易管理):
class Topic(models.model)
    user = models.ForeignKey(UserProfile, related_name = 'topics')
    lists = models.ManyToManyField(List, related_name = 'topics')

class List(models.model)
    activities = models.ManyToManyField(Activity, related_name = 'lists')

class Activity(models.model)
    activity = models.CharField(max_length=250)

然后你可以做很棒的事情:
user = UserProfile.objects.get(pk=1) # for example
user.topics.all() # returns all topics

topic = Topic.objects.get(pk=1) # for example
topic.users.get(pk=1) # returns user
lists = topic.lists.all() # returns List object instances QuerySet

for list in lists:
    list.activites.all()

便利信息:https://docs.djangoproject.com/en/dev/ref/models/relations/


lists 将是一个查询集而不会有一个 activities 属性。 - Daniel Roseman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接