繁体   English   中英

如何遍历查询集并获取值 Django

[英]How to iterate through queryset and get value Django

我想根据用户添加的动物做一个简单的推荐系统。 我只想显示某个类别的产品,该类别已映射到“zwierzeta”字典中。 所以基本上如果用户选择他有一匹马(它是 id 1,我只想显示类别 4 的产品)另外如果用户有超过 1 只动物,我想从类别 id 列表中随机显示它们。 逻辑似乎没问题,我是 django 的新手,我不知道如何实际遍历查询集以及如何从特定查询集中获取值(动物)。 get 方法不起作用。 您知道如何从查询集中获取特定值吗?

class MyAnimal(models.Model):
    name = models.CharField(max_length=256)
    animal = models.ForeignKey(Animal, on_delete=models.CASCADE, null=False)

class ProductInStore(models.Model):
    product = models.ForeignKey('Product', on_delete=models.CASCADE)

class Product(models.Model):
    product_category = models.ManyToManyField(EcommerceProductCategory)

def list(self, request):
    ProductCategoryAnimal.objects
    qs = MyAnimal.objects.filter(user=self.request.user)
    if qs:
        for q in qs:
            categories = []
            get_category = ProductCategoryAnimal.objects.values_list('category_id', flat=True).get(animal_id=q.animal_id)
            categories.append(get_category)
        print(categories)
        result = ProductInStore.objects.filter(
            product__product_category__id=random.choice(categories)
        )
    else:
        result = ProductInStore.objects.all()[:1]
    return result.order_by('?')[:1]

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/core/handlers/base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/rest_framework/views.py", line 509, in dispatch
    response = self.handle_exception(exc)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/rest_framework/views.py", line 469, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
    raise exc
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/rest_framework/views.py", line 506, in dispatch
    response = handler(request, *args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/rest_framework/generics.py", line 199, in get
    return self.list(request, *args, **kwargs)
  File "/Users/jakubstrawa/programming/DeorPythonek/api/ecommerce/views.py", line 180, in list
    product__category_id=random.choice(categories)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/db/models/query.py", line 942, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/db/models/query.py", line 962, in _filter_or_exclude
    clone._filter_or_exclude_inplace(negate, *args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/db/models/query.py", line 969, in _filter_or_exclude_inplace
    self._query.add_q(Q(*args, **kwargs))
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/db/models/sql/query.py", line 1358, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/db/models/sql/query.py", line 1380, in _add_q
    split_subq=split_subq, check_filterable=check_filterable,
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/db/models/sql/query.py", line 1319, in build_filter
    condition = self.build_lookup(lookups, col, value)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/db/models/sql/query.py", line 1156, in build_lookup
    raise FieldError('Related Field got invalid lookup: {}'.format(lookup_name))
django.core.exceptions.FieldError: Related Field got invalid lookup: category_id

您可以将其简化为:

def list(self, request):    
    zwierzeta = {1 : 4, 6: 5, 8: 6, 9: 6, 4: 3}
    qs = MyAnimal.objects.filter(user=self.request.user)
    if qs:
        category=random.choice([zwierzeta[q.animal_id] for q in qs])
        result = ProductInStore.objects.filter(
            product__product_category__id=category
        )
    else:
        result = ProductInStore.objects.all()
    return result.order_by('?')[:1]

但是使用带有硬编码项目的字典看起来很奇怪:这意味着您需要提前知道主键,并且以后很难添加新类别,因为它需要部署新的软件版本。 model 类别和动物之间的关系作为ManyToManyField或等价物可能更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM