我有這種模型定義,我希望有一個與相應(yīng)產(chǎn)品的屬性距離 < 40 的產(chǎn)品列表class Product(models.Model): title = models.CharField(max_length=255) near_duplicate_images = models.ManyToManyField("self", through="NearDuplicate")class NearDuplicate(models.Model): first_product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name="first_product") second_product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name="second_product") distance = models.IntegerField(null=True, blank=True)我試過這樣做來直接訪問關(guān)系p = Product.objects.filter(near_duplicate_images__distance__lt=40).prefetch_related('near_duplicate_images')但它引發(fā)了這個例外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"))但它引發(fā)了這個例外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 回答

江戶川亂折騰
TA貢獻(xiàn)1851條經(jīng)驗 獲得超5個贊
我認(rèn)為這樣的查詢應(yīng)該有效。因為你想要distance
小于 40 的產(chǎn)品列表。
products = NearDuplicate.objects.filter(distance__lt=40).values('first_product', 'second_product')
這將給出類似于
<QuerySet [{'first_product': 1, 'second_product': 2}]>
更新-我已經(jīng)對這些查詢進(jìn)行了一些嘗試。如果你想獲得任何first_product
或中存在的產(chǎn)品的絕對列表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
所有產(chǎn)品,第二個查詢列出中列出的所有產(chǎn)品second_product
。現(xiàn)在您可以合并它們并使用以下查詢?nèi)〕霾煌闹?/p>
q1.union(q2).distinct()
這將使最終輸出為
<QuerySet [1, 2]>
我希望它有所幫助。:)

ITMISS
TA貢獻(xiàn)1871條經(jīng)驗 獲得超8個贊
我認(rèn)為您不需要“near_duplicate_images”字段。嘗試類似的東西(尚未測試):
p = Product.objects.filter(title__in=NearDuplicate.object.filter(first_product=current_product, distance=40).values('second_product',)
添加回答
舉報
0/150
提交
取消