我有3个模型,例如Store,ProductsArea和Item。一个商店可以有多个ProductsArea,而ProductsArea可以有很多Items。
#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中获取所有商品。商店中的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 Yellow
和Shirt 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
谁能帮我?谢谢我的朋友们。
答案 0 :(得分:2)
问题是您使用了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
,因为否则可能会给人以(假)印象,即id
中的Item
。
然后,我们可以使用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可以不同。路径),您将获得一个属于该Item
的{{1}}个列表。