Как выполнить итерацию по набору запросов и получить значение 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):
zwierzeta = {1 : 4, 6: 5, 8: 6, 9: 6, 4: 3}
qs = MyAnimal.objects.filter(user=self.request.user)
#checking if there is an animal with user == self.request.user
if qs:
if len(qs)==1:
# if user has only 1 animal, get that animals race and if compare it with the dictionary to get product__product_category
animal = qs.get('anmial')
qs_value = zwierzeta[animal]
return ProductInStore.objects.filter(product__product_category=qs_value)[:1]
elif len(qs)>1:
# if user has more than 1 animal, iterate through all the animals, get all the individual category id for that specific animal and append it
list_of_categories = []
for querysets in qs:
category_id = querysets.get('animal')
value = zwierzeta[category_id]
list_of_categories.append(value)
return ProductInStore.objects.filter(product__product_category=random.choice(list_of_categories))
return ProductInStore.objects.all().order_by('?')[:1]
return ProductInStore.objects.all().order_by('?')[:1]
Вы можете упростить это до:
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]
Но использование словаря с жестко закодированными элементами выглядит странно: это означает, что вам нужно заранее знать первичные ключи, и впоследствии трудно добавлять новые категории, поскольку это требует развертывания новой версии программного обеспечения. Возможно, было бы лучше моделировать связь между категорией и животным как ManyToManyField или эквивалент.