Django исключает набор запросов __in для * каждого * элемента в списке - PullRequest
0 голосов
/ 22 мая 2018

Это немного отличается от набора запросов фильтра Django __in для * каждого * элемента в списке и набора запросов фильтра Django __in для * каждого * элемента в списке (2.0) Учитывая следующеемодели:

class Product(BaseModel):
    ''' whatever '''

class Customer(BaseModel):
    blacklist = models.ManyToManyField(Product, blank=True)

class Advisory(BaseModel):
    product_names = models.ManyToManyField(Product)

Где клиент ведет список продуктов, которые ему не интересны. Как я могу получить список рекомендаций для данного клиента?

Допустим, у меня они есть вмоя БД:

#   Advisory 1 (should be included as Product 1 isn't in the customers blacklist)
#       product_names
#           Product 1
#           Product 2
#           Product 3
#   Advisory 2 (should be excluded)
#       product_names
#           Product 2
#           Product 3
#   Customer 1
#       blacklist
#           Product 2
#           Product 3
#           Product 4
#           Product 5

Если я использую набор запросов, подобный этому:

queryset = Advisory.objects.all()
blacklist = Customer.blacklist.all()
queryset = queryset.exclude(product_names__in=blacklist).distinct()

Это исключит как рекомендации 1, так и рекомендации 2, поскольку продукты 2 и 3 присутствуют в черном списке клиентов

1 Ответ

0 голосов
/ 22 мая 2018

Я нашел решение проблемы, выполнив его в два этапа:

# Get the queryset with all advisories
queryset = Advisory.objects.all()
# Find the products the customer doesn't care about
blacklist = Customer.objects.get(pk=customer_id).blacklist.all()
# Build a whitelist of products excluding the blacklist from the customer
whitelist = Product.objects.all().exclude(id__in=blacklist)
# And filter the queryset with the new whitelist
queryset = queryset.filter(product_names__in=whitelist).distinct()
...