首页 > 解决方案 > Django通过多对多关系的额外字段过滤

问题描述

我有这种模型定义,我希望有一个与相应产品的属性距离 < 40 的产品列表

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)

我试过这样做直接访问关系

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

标签: pythondjango

解决方案


我认为您不需要“near_duplicate_images”字段。尝试类似(尚未测试):

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

查询集 API - “_in”


推荐阅读