【问题标题】:Django get all records of related modelsDjango 获取相关模型的所有记录
【发布时间】:2013-12-22 03:20:32
【问题描述】:

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

【问题讨论】:

    标签: python django django-models django-queryset


    【解决方案1】:

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

    用户的所有活动:

    Activity.objects.filter(list__topic__user=my_user)
    

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

    Activity.objects.filter(list__topic=my_topic)
    

    (请注意,当前主题仅适用于单个用户。不确定这是否是您的意思:您描述了一个用户选择一个主题,这在此处不可能发生。可能来自的链接UserProfile 的主题应该是另一种方式,或者是一个多对多。)

    【讨论】:

    • 是反向关系。
    • 为什么这对反向关系有效?我不应该使用类似 list_set__topic 的东西吗? (我只是不知道这种可能性)
    • 关于您对该主题的评论,我知道这一点。出于演示目的,我对其进行了一些简化。
    • @jvannistelrooy 请参阅the docs:“要引用“反向”关系,只需使用模型的小写名称即可。”
    【解决方案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/

    【讨论】:

    • lists 将是一个查询集,不会有 activities 属性。
    猜你喜欢
    • 2017-06-18
    • 2015-09-01
    • 1970-01-01
    • 2011-01-15
    • 2014-09-28
    • 2019-02-24
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    相关资源
    最近更新 更多