Django树查询跨越多模型关系



请考虑以下代码。我想创建与特定的插入用户相关的树结构之类的东西(将在表中(。我想拥有一个概述,其中显示了该用户在子类别中具有项目的所有类别。我的查询有效,但在这些子类别中为我提供了所有子类别记录和所有提出项目(因此,不仅是用户具有记录的子集。

我有另一种工作方式,是从item -Model开始,然后在树上上升,但这不是我要寻找的(这使得创建动态的表格集很远,远远取决于Django模板层(。<<<<<<<<<<<</p>

我已经查看了select_reced and prefetch,但是我无法接近解决方案。任何帮助都将被申请。

models.py:

from django.db import models
from model_utils.models import TimeStampedModel
from django.conf import settings

User = settings.AUTH_USER_MODEL
class MainCat(TimeStampedModel):
    name = models.CharField(max_length=100, unique=True)
    rank = models.IntegerField(default=10)
    icon_class = models.CharField(max_length=100, null=True, blank=True)

class SubCat(TimeStampedModel):
    name = models.CharField(max_length=100, null=False, blank=False)
    slug = models.SlugField(null=True, blank=True)
    icon_class = models.CharField(max_length=100, null=True, blank=True)
    main_cat = models.ForeignKey(MainCat)

class Item(TimeStampedModel):
    user = models.ForeignKey(User, blank=True, null=True)
    item_name = models.CharField(max_length=100, null=False, blank=False)
    sub_cat = models.ForeignKey(SubCat, blank=True, null=True)

views.py:

from django.views.generic import ListView
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import MainCat
class MainCatByUserListView(LoginRequiredMixin, ListView):
    model = MainCat
    def get_queryset(self):
        qs = super(MainCatByUserListView, self).get_queryset()
        qs = qs.filter(subcat__item__user=self.request.user)
    return qs

模板:

< html >
< body >
{% for maincat in object_list %}
    < ul >
        <li> {{maincat.name}} </li>
        <ul>
        {% for subcat in maincat.subcat_set.all %}
            <li> {{subcat.name}} </li>
            {% for item in subcat.item_set.all %}
                <li> {{item.name}} </li>
            </ul>
        </ul>
        {% endfor %}
    {% endfor %}
{% endfor %}
< / body >
< / html >
{% endfor %}

您应该能够使用以下内容: Subcat.objects.filter(item_set__user=self.request.user).select_related('main_cat')

finaly可以回答我的问题。供将来参考:

class MainCatListView(LoginRequiredMixin, ListView):
    model = MainCat
    template_name = 'app/main_cat_overview.html'
    def get_queryset(self):
        qs = super(MainCatListView, self).get_queryset()
        qs_user_cat_set = SubCat.objects.filter(item__user=self.request.user).prefetch_related(Prefetch(
            "item_set",
        queryset=Item.objects.filter(user=self.request.user),
        to_attr="item_attr")
            ).distinct()
        qs = qs.filter(subcat__item__user=self.request.user).prefetch_related(Prefetch(
            "subcat_set",
            queryset=qs_user_subcat_set,
            to_attr="subcat_attr")
                ).distinct()
        return qs

最新更新