Как выполнить итерацию по набору запросов и получить значение 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 или эквивалент.

Вернуться на верх