Python Django获得相关模型的所有记录
我有3款待办事项列表应用程序: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
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)