Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django获得相关模型的所有记录_Python_Django_Django Models_Django Queryset - Fatal编程技术网

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

Python Django获得相关模型的所有记录,python,django,django-models,django-queryset,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 = mode

我有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()
,然后通过相关对象进行循环,或者有没有更有效的方法不进行循环?(或者我应该改变我的模型吗?

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

然后你可以做一些很棒的事情:

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()

方便的信息:

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

用户的所有活动:

Activity.objects.filter(list__topic__user=my_user)
用户针对某个主题的所有活动:

Activity.objects.filter(list__topic=my_topic)

(请注意,当前一个主题仅针对单个用户。不确定这是否是您的意思:您描述了一个用户选择了一个主题,这在这里是不可能发生的。从主题到用户配置文件的链接可能会走另一条路,或者是多个。)

列表
将是一个查询集,没有
活动
属性。这是一种反向关系。为什么这适用于反向关系?我不应该使用类似列表设置主题的东西吗?(我只是不知道这种可能性)关于你对这个话题的评论,我知道。为了便于演示,我对其进行了一些简化。@jvannistelrooy请参阅:“要引用“反向”关系,只需使用模型的小写名称。”
Activity.objects.filter(list__topic=my_topic)