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

时间:2013-12-05 09:06:58

标签: python django django-models django-queryset

我有3个待办事项列表应用模型:

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 个答案:

答案 0 :(得分:11)

使用双下划线语法查询关系。

用户的所有活动:

Activity.objects.filter(list__topic__user=my_user)

主题用户的所有活动:

Activity.objects.filter(list__topic=my_topic)

(请注意,目前主题仅针对单个用户。不确定这是不是您的意思:您描述用户选择主题,这在此处无法实现。可能来自UserProfile的主题应该是另一种方式,或者是ManyToMany。)

答案 1 :(得分:0)

给他们相关的名字(它更容易管理):

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/