【问题标题】:How to filter objects based on Foreign key如何根据外键过滤对象
【发布时间】:2018-03-04 03:31:11
【问题描述】:

我有 2 个模型类,分别称为 product 和 product_category

class product_category(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1, on_delete=models.CASCADE)
    category_name = models.CharField(max_length=20, blank=False, null=False, default="")
    slug = models.SlugField(max_length=255, unique=True)


class product(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1, on_delete=models.CASCADE)
    product_name = models.CharField(max_length=50, blank=False, null=False, default="")
    product_description = models.TextField(max_length=280, blank=True, null=True, default="")
    product_type = models.ForeignKey(product_category, related_name='type_category', blank=True, null=True, on_delete=models.CASCADE)
    slug = models.SlugField(max_length=255, unique=True)


在 views.py 中,这是我通常加载与单个用户相关的所有产品的方式

all_category = product.objects.filter(user=user)

但我正在努力过滤的是基于它们所在类别的产品列表。

如您所见,product_type 是可选的,因此某些产品可能没有任何类型。这些产品应列在列表末尾。

这就是我想在网站上显示的方式

  • 类别 1
    • product-1
    • product-2
    • product-3
  • 类别 2
    • product-4
    • product-5
    • 产品6
  • 类别 3
    • product-7
  • product-8
  • product-9
  • product-10

我怎样才能做到这一点?

编辑 1.

感谢neeraj-kumar,我找到了我要找的东西。

这是他的答案,在代码中添加了一点
以便更清楚地看到结果。

views.py

    all_category = product_category.objects.filter(user=user)
    product_exclude = product.objects.exclude(id__in=all_category.values_list('type_category__id',flat=True)).filter(user=user)

模板.html

{% for cat in all_category %}
    {% with products=cat.type_category.all %}
        <h5>{{cat.category_name}}</h5>
        {% if products|length %}
            {% for pro in products %}
                <p>{{ pro }}</p>
            {% endfor %}
        {% endif %}
        <br>
    {% endwith %}
{% endfor %}
{% for pro in product_exclude %}
    <p>{{ pro }}</p>
{% endfor %}

【问题讨论】:

    标签: django filter foreign-keys annotate


    【解决方案1】:
    all_category = product_category.objects.filter(user=user)
    product_exclude = product.objects.exclude(id__in=all_category.values_list('type_category__id',flat=True)
    

    在模板中传递两个 var

    {% for cat in all_category %}
       {% with products = cat.type_category.all %}
           {% if products|length %}
                {% for pro in products %}
                    {{ pro }}
                {% endfor %}
           {% endif %}
       {% endwith %}
    {% endfor %}
    {% for pro in product_exclude %}
         {{ pro }}
    {% endfor %}
    

    【讨论】:

    • 嘿,我发现了一个错误...如果有 4 个类别,并且如果只有 3 个(或更少)类别中有任何产品,则它不会过滤 product_exclude...即 product_exclude是空的,即使有很多没有类别的产品......我们如何解决这个问题?
    • 由于某种原因无法正常工作。我觉得问题出在 .exclude() 中。因为当我用 .filter 替换 .exclude 时,它​​会显示我们想要排除的项目列表。我们怎样才能摆脱这个错误?有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 2021-04-02
    • 2020-01-12
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多