为了账号安全,请及时绑定邮箱和手机立即绑定

Django 按多对多关系的额外字段过滤

Django 按多对多关系的额外字段过滤

郎朗坤 2022-12-06 15:42:34
我有这种模型定义,我希望有一个与相应产品的属性距离 < 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
查看完整描述

2 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

我认为这样的查询应该有效。因为你想要distance小于 40 的产品列表。

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

这将给出类似于

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

更新-我已经对这些查询进行了一些尝试。如果你想获得任何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]>

我希望它有所帮助。:)


查看完整回答
反对 回复 2022-12-06
?
ITMISS

TA贡献1871条经验 获得超8个赞

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

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

查询集 API - “_in”


查看完整回答
反对 回复 2022-12-06
  • 2 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号