Django фильтр по дополнительному полю для отношений "многие ко многим" - PullRequest
0 голосов
/ 26 мая 2020

У меня есть такое определение модели, и я хочу sh иметь список продуктов, у которых расстояние атрибута <40 от соответствующего продукта отношение </p>

p = Product.objects.filter(near_duplicate_images__distance__lt=40).prefetch_related('near_duplicate_images')

Но это вызывает это исключение

django.core.exceptions.FieldError: Related Field got invalid lookup: distance

Я тоже пробовал это сделать

p = Product.objects.all().prefetch_related(Prefetch("near_duplicate_images", queryset=NearDuplicate.objects.filter(distance__lt=40), to_attr="near_duplicate_images_list"))

Но это вызывает это исключение

django.core.exceptions.FieldError: Cannot resolve keyword 'near_duplicate_images_rel_+' into field. Choices are: distance, first_product, first_product_id, id, second_product, second_product_id

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

Думаю, подобный запрос должен работать. Если вам нужен список продуктов, у которых distance меньше 40.

products = NearDuplicate.objects.filter(distance__lt=40).values('first_product', 'second_product')

Это даст результат, аналогичный

<QuerySet [{'first_product': 1, 'second_product': 2}]>

UPDATE - I немного поиграли с запросами. Если вы хотите получить абсолютный список товаров, присутствующих в любом из first_product или second_product. Возможно, вам потребуется использовать несколько запросов, например

q1= NearDuplicate.objects.filter(distance__lt=40).values_list('first_product', flat=True)

. Это даст результат как

<QuerySet [1]>

и

q2 = NearDuplicate.objects.filter(distance__lt=40).values_list('second_product', flat=True)

Это даст результат как

<QuerySet [2]>

Первый запрос запрашивает все продукты, перечисленные в first_product, а второй запрос перечисляет все продукты, представленные в second_product. Теперь вы можете объединить их обоих и извлечь отдельные значения, используя следующий запрос

q1.union(q2).distinct()

Это даст окончательный результат как

<QuerySet [1, 2]>

Надеюсь, это поможет. :)

0 голосов
/ 26 мая 2020

Думаю, вам не нужно поле near_duplicate_images. Попробуйте что-нибудь вроде (не тестировал):

p = Product.objects.filter(title__in=NearDuplicate.object.filter(first_product=current_product, distance=40).values('second_product',)

QuerySet API - "_in"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...