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

2024-03-28 13:55:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有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(),而不是在相关对象中循环,还是有一种更有效的方法不循环?(或者我应该改变我的模型?)


Tags: 用户模型应用程序主题列表topicmodelmodels
2条回答

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

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/

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

用户的所有活动:

Activity.objects.filter(list__topic__user=my_user)

用户针对某个主题的所有活动:

Activity.objects.filter(list__topic=my_topic)

(请注意,当前主题仅适用于单个用户。不确定这是不是你的意思:你描述了一个用户选择一个主题,这在这里是不可能发生的。从Topic到UserProfile的链接可能会走向另一个方向,或者是一个manytomy。)

相关问题 更多 >