我有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)
当用户选择主题,然后选择列表(子类别)时,这是有意义的,该列表显示该列表上的所有活动。
但我如何有效地查询
之类的内容我是否需要在查询中使用select_related()
而不是通过相关对象循环,或者是否有更有效的方法而不循环? (或者我应该改变我的模型吗?)
答案 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/