使django选择相关对象的列表

时间:2013-03-01 20:06:04

标签: django orm django-models django-queryset

我有一个这样的模型:

class Issue(models.Model):
    project = models.ForeignKey(Project, null=True, blank=True)
    key = models.CharField(max_length=30, null=True, blank=True)
    title = models.CharField(max_length=400)
    description = models.TextField(null=True, blank=True)
    createdByUser = models.ForeignKey(User)
    creationDate = models.DateTimeField()
    updatedDate = models.DateTimeField(null=True, blank=True)
    trackerURL = models.URLField(null=True, blank=True)
    is_feedback = models.BooleanField()
    is_public_suggestion = models.BooleanField()

class IssueWatch(models.Model):
    issue = models.ForeignKey(Issue)
    user = models.ForeignKey(User)
    reason = models.CharField(max_length=30, null=False, blank=False)

完整代码在这里: https://github.com/freedomsponsors/www.freedomsponsors.org/blob/master/djangoproject/core/models.py

这适用于类似问题跟踪器的系统。有Issues,用户可以观看问题(IssueWatch)来接收电子邮件更新。

我想创建一个查询,返回用户正在观看的问题列表。类似的东西:

IssueWatch.objects.select('issue').filter(user=17)

当然,没有这样的"选择"我喜欢上面使用的方法。

有什么方法可以让Django返回一个懒惰的Issue(而不是IssueWatch)对象集合?

---------------更新-----------

我试过阅读user.issue_set.all()并且它有效。 现在我很困惑。为什么User会遇到issue_set? 如果我创建了另一个让用户喜欢的模型,例如:

,那该怎么办?
class IssueFavorite(models.Model):
    issue = models.ForeignKey(Issue)
    user = models.ForeignKey(User)

那么issue_set意味着什么?

--------------- UPDATE2 -----------

Duh,我找到了答案。 issue_set是指用户创建的问题(因为属性:Issue.createdByUser) 那不是我想要的问题清单。

2 个答案:

答案 0 :(得分:2)

只需一个简单的filter即可。选择查询允许反向关系。所以:

Issue.objects.filter(issuewatch__user = 17)

答案 1 :(得分:2)

因此,如果我理解这个问题,您想要选择特定用户正在观看的所有问题吗?这将通过以下方式完成:

Issue.objects.filter(issuewatch__user=17)

Source