Как фильтровать объекты, что содержится в ФК? - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть три модели, такие как Store, ProductsArea и Item. В Магазине может быть много ProductsArea, а в ProductsArea может быть много предметов.

    #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, щелкнув ListItems из определенной ProductArea, с помощью 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 Может кто-нибудь мне помочь? Спасибо большое друзьям.

1 Ответ

0 голосов
/ 02 сентября 2018

Проблема в том, что вы используете id [Python-doc] . Теперь id - это встроенная функция Python: она сопоставляет все объекты уникальному числу. Например, он используется для проверки, ссылаются ли две переменные на один и тот же объект . Детали id здесь не очень важны, дело в том, что id - это , а не id здесь, в URL.

Вам нужно будет извлечь id откуда-то, например, это может быть часть URL. Мы можем указать это в urls.py:

#  app/urls.py

from django.urls import path

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

Я бы посоветовал использовать area_id здесь вместо id, так как в противном случае это может создать (ложное) впечатление, что это id из Item s.

Затем мы можем обработать параметр URL с помощью self.kwargs:

#  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(<b>product_area__id=self.kwargs['area_id']</b>)

Если вы извлекаете localhost:8000/items/123123 идеей ProductArea, URL может быть другим, если, например, app/urls.py включены в непустой путь), вы получите список из Item s, которые принадлежат этому ProductArea.

...