列出模板中的ForeignKey关联实例(查询集中的queryset)

时间:2017-02-26 01:30:11

标签: python django

我有一个网站可以记录当地的徒步旅行,用户可以记录他们一直在徒步旅行。我有一个包含徒步旅行的搜索页面,我想要显示的其中一个字段是所有参加过徒步旅行的人的列表。我已经在远足的个别详细信息页面中找到了这个,但无法弄清楚如何在打印远足的查询集中创建新的查询集,以便在搜索页面上显示此信息。

以下是一些代码:

models.py:

self.delegate.settingsDidChange(_:)

views.py:

class Hike(models.Model):
    name = models.CharField(max_length=255, unique=True)
    slug = models.SlugField(unique=True)
    ...

class UserLog(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    hike = models.ForeignKey(Hike, on_delete=models.CASCADE)

模板:

def hike_list(request):
    qs = Hike.objects.all()
    ... some other filters here
?-->users = UserLog.objects.filter(id=qs.id)

以下是个人徒步旅行详细信息页面中的工作代码:

views.py:

{% for qs in qs %}
{{ hike.name }}{{ hike.other_details_and_stuff }}
?----> {% for users in hikes %}{{ user.name }}{% endfor %}
{% endfor %}

如何调用查询集中每个项目的slug,然后对其运行查询集?

1 个答案:

答案 0 :(得分:1)

最简单的方法是将ManyToManyField添加到Hike

class Hike(models.Model):
    ...
    users = models.ManyToManyField(User, through='app.UserLog')

如果UserLog中没有其他字段,您甚至可以删除UserLog模型和through参数。在模板中,您可以执行以下操作:

{% for hike in qs %}
  {{ hike.name }}{{ hike.other_details_and_stuff }}
  {% for user in hike.users.all %}{{ user.name }}{% endfor %}
{% endfor %}

为了避免过多的查询,您应该在视图中的Hike查询中预取用户:

qs = Hike.objects.all().prefetch_related('users')

如果没有ManyToManyField,您可以添加属性和用户相同的模板,但是不能轻易使用prefetch子句:

class Hike(models.Model):
    ...
    @property
    def users(self):
        return User.objects.filter(userlog__hike=self)