如何过滤 FK 中包含的对象?

Posted

技术标签:

【中文标题】如何过滤 FK 中包含的对象?【英文标题】:How Filter Objects what contains in FK? 【发布时间】:2019-02-07 19:52:57 【问题描述】:

我有三个模型,例如 Store、ProductsArea 和 Item。一个 Store 可以有很多 ProductsArea,ProductsArea 可以有很多 Item。

    #models.py
    class Store(models.Model):
        name = models.CharField(max_length=64, unique=True)
        description = models.TextField(null=True, blank=True)

    class ProductArea(models.Model):
        store = models.ForeignKey(Store, related_name='productarea', on_delete=models.CASCADE)
        name = models.CharField(max_length=64,verbose_name=_('Name'))

    class Item(models.Model):
        product_area = models.ForeignKey(ProductArea, related_name='items', on_delete=models.CASCADE, verbose_name='Menu')
        name = models.CharField(max_length=64, verbose_name=_('Name'))
        price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name=_('Price'))

在我看来,我正在使用 CBV,我想返回包含相同 ProductArea 的所有项目,单击确定的 ProductArea 中的 ListItems,使用 FK 他们从 ProductArea 中获取所有项目。 Store 中的 ProductArea 也是如此。

Store - Clothes Store
Product Area - Shirts, Pants
Item - Shirt Yellow(PA.Shirts), Shirt Blue(PA.Shirts)
Item - Pant Black(PA.Pants), Pants Red(PA.Pants)

如果点击Shirts,我想返回一个包含Shirt YellowShirt Blue 的列表。

我在我看来尝试过这个:

def get_queryset(self):
    product_area_id = ProductArea.objects.get(id)
    product_area = ProductArea.objects.get(pk=product_area_id)
    items_in_productarea = Item.objects.filter(product_area=product_area)
    return items_in_productarea

但是不行,有builtin_function_or_method' object is not iterable 谁能帮我?非常感谢朋友们。

【问题讨论】:

首先id不是不是 URL的id(请同时发布您的相关url),它是身份功能。 【参考方案1】:

问题是你使用id [Python-doc]。现在id 是一个内置 Python 函数:它将所有对象映射到一个唯一的数字。例如,它用于检查两个变量是否引用 same 对象。 id 的细节在这里并不重要,关键是id 不是 URL 中的id

您需要从某处获取id,例如它可以是URL 的一部分。我们可以在urls.py中指定:

#  app/urls.py

from django.urls import path

urlpatterns = [
    path('items/<int:area_id>/', MyItemView.as_view(), name='my_item_view')
]

我建议在这里使用area_id 而不是id,否则可能会给人一种(错误的)印象,即它是Items 的id

然后我们可以处理带有self.kwargs的URL参数:

#  app/views.py

from django.views.generic.list import ListView
from app.models import Item

class MyItemView(ListView):

    # ...

    def get_queryset(self):
        return Item.objects.filter(product_area__id=self.kwargs['area_id'])

如果您获取localhost:8000/items/123(使用123 的想法ProductArea,例如如果app/urls.py 包含在非空路径中,则URL 可能会有所不同),您将获得一个列表属于此ProductAreaItems。

【讨论】:

很好的解决方案,很好的解释......它很有效,我明白了,并将应用于我项目中的其他事情。非常感谢朋友。 如果是解决方案,请选择答案作为正确答案。谢谢。

以上是关于如何过滤 FK 中包含的对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何找到 JavaScript 数组中包含的最大数?

NSPredicate 按数组中包含的第一个字母过滤

在 C# 中,如何使用反射计算表达式主体输出函数中包含的属性数量?

如何监视 ObservableList JavaFX 中包含的对象的更改

如何以简单的方式更改堆上 QVector 数组中包含的对象的值?

如何从视图控制器中包含的视图调用方法?