如何限制在 django template-side 中显示的 m2m 项目?
How can I limit what m2m items are displayed in django template-side?
我在限制 m2m 字段的视图中有一个查询集。查询似乎工作正常并获得正确的 parent objects,但是当我循环遍历模板中的 parent.object_set.all 时,我看到 m2m objects 在技术上不包含在初始查询(或者无论如何都不应该),但现在包括在内,因为它们是 parent 的 child m2m object_set.
的一部分
试着把它放在一个更通用的例子中......我完全是在编造 parents 和 children:
class Parent(models.Model):
name = models.CharField(max_length=42)
children = models.ManyToManyField(Child)
class Child(models.Model):
...
# no, I'm not serious on this as a data structure, but for the example....
male = models.BooleanField()
female = models.BooleanField()
class ParentListView(ListView):
...
def get_queryset(self):
...
parents = Parent.objects.filter(children__male = True)
在模板中。
{% for parent in parents %}
{{ parent.name }}
{% for child in parent.child_set.all %}
{% comment %}
oops, I got all the children of this parent....I only want those that were male from the original queryset. I need the child_set to only be those that met the criteria in that first queryset. How do I accomplish this?
{% endcomment %}
{% endfor %}
{% endfor %}
您不能使用 Django 模板语言提供过滤器参数。
在 Django 1.7+ 中,您可以在视图中定义查询集时使用 prefetch_related
和自定义 Prefetch
object。
def get_queryset(self):
...
parents = Parent.objects.filter(
children__male=True
).prefetch_related(
Prefetch('children', queryset=Child.objects.filter(male=True), to_attr='male_children')
)
请注意,在上面的示例中,您可能需要使用 distinct()
来防止每个男性 child.
重复 parents
我们使用了文档中推荐的 to_attr
参数。在模板中,我们然后循环遍历男性 children.
{% for parent in parents %}
{{ parent.name }}
{% for child in parent.male_children %}
{{ child }}
{% endfor %}
{% endfor %}
我在限制 m2m 字段的视图中有一个查询集。查询似乎工作正常并获得正确的 parent objects,但是当我循环遍历模板中的 parent.object_set.all 时,我看到 m2m objects 在技术上不包含在初始查询(或者无论如何都不应该),但现在包括在内,因为它们是 parent 的 child m2m object_set.
的一部分试着把它放在一个更通用的例子中......我完全是在编造 parents 和 children:
class Parent(models.Model):
name = models.CharField(max_length=42)
children = models.ManyToManyField(Child)
class Child(models.Model):
...
# no, I'm not serious on this as a data structure, but for the example....
male = models.BooleanField()
female = models.BooleanField()
class ParentListView(ListView):
...
def get_queryset(self):
...
parents = Parent.objects.filter(children__male = True)
在模板中。
{% for parent in parents %}
{{ parent.name }}
{% for child in parent.child_set.all %}
{% comment %}
oops, I got all the children of this parent....I only want those that were male from the original queryset. I need the child_set to only be those that met the criteria in that first queryset. How do I accomplish this?
{% endcomment %}
{% endfor %}
{% endfor %}
您不能使用 Django 模板语言提供过滤器参数。
在 Django 1.7+ 中,您可以在视图中定义查询集时使用 prefetch_related
和自定义 Prefetch
object。
def get_queryset(self):
...
parents = Parent.objects.filter(
children__male=True
).prefetch_related(
Prefetch('children', queryset=Child.objects.filter(male=True), to_attr='male_children')
)
请注意,在上面的示例中,您可能需要使用 distinct()
来防止每个男性 child.
我们使用了文档中推荐的 to_attr
参数。在模板中,我们然后循环遍历男性 children.
{% for parent in parents %}
{{ parent.name }}
{% for child in parent.male_children %}
{{ child }}
{% endfor %}
{% endfor %}