我有一个网站可以记录当地的徒步旅行,用户可以记录他们一直在徒步旅行。我有一个包含徒步旅行的搜索页面,我想要显示的其中一个字段是所有参加过徒步旅行的人的列表。我已经在远足的个别详细信息页面中找到了这个,但无法弄清楚如何在打印远足的查询集中创建新的查询集,以便在搜索页面上显示此信息。
以下是一些代码:
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,然后对其运行查询集?
答案 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)