列出模板中与ForeignKey关联的实例(queryset中的queryset)

2024-09-24 22:21:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个网站记录了当地的徒步旅行,用户可以记录他们曾经徒步旅行。我有一个包含徒步旅行的搜索页面,我试图显示的一个字段是所有徒步旅行的人的列表。我已经在hike的个人详细信息页面中了解到了这一点,但是我不知道如何在正在打印hike的queryset中创建一个新的queryset,以便在搜索页面上显示此信息

下面是一些代码:

models.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)

views.py:

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

模板:

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

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

views.py:

def hike_detail (request, slug)
    users = UserLog.objects.filter(hike__slug=slug)

如何从queryset中的每个单独项调用slug,然后对其运行queryset


Tags: namepyobjectsmodels记录详细信息页面users
1条回答
网友
1楼 · 发布于 2024-09-24 22:21:08

最简单的方法是将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)

相关问题 更多 >