django - 如何在嵌套的 Django Rest 中过滤外键属性(列表)?
问题描述
这是Model,要实现的过滤属性有Brand、Product_type、Price(price_range)。如果品牌可能不止一个并且价格在价格范围内(例如:2000-3000),我尝试使用链式过滤器,
objects = Tyre.objects.filter(brand__name__in=brands).filter(product_type__in=types).filter(
tyre_price__price__range=(min_price, max_price))
但是当任何一个属性发送为空时,则结果为空查询集。如何实施??预先感谢。
class Brand(models.Model):
name = models.CharField(max_length=100)
brand_type = models.CharField(max_length=30)
class Tyre(models.Model):
vehicle = models.ForeignKey(Vehicle, on_delete=models.DO_NOTHING)
product_type = models.CharField(max_length=100)
normalsectionwidth = models.CharField(max_length=100)
normalaspectratio = models.CharField(max_length=100)
constructiontype = models.CharField(max_length=100)
rimdiamter = models.CharField(max_length=100)
loadindex = models.CharField(max_length=100)
speedsymbol = models.CharField(max_length=100)
category = models.ForeignKey(Category, on_delete=models.PROTECT)
pattern = models.CharField(max_length=100)
description = models.CharField(max_length=100)
warranty_summery = models.CharField(max_length=500)
left_image = models.CharField(max_length=500)
name = models.CharField(max_length=100)
right_image = models.CharField(max_length=500)
front_image = models.CharField(max_length=500)
back_image = models.CharField(max_length=500)
mrp = models.CharField(max_length=100)
construction_type_R = models.CharField(max_length=100)
brand = models.ForeignKey(Brand,models.DO_NOTHING, related_name='brand')
brand_model = models.ForeignKey(BrandModel, models.DO_NOTHING)
warranty_by_year = models.CharField(max_length=100)
warranty_by_km = models.CharField(max_length=100)
class TyrePrices(models.Model):
tyre = models.ForeignKey(Tyre, related_name='tyre_price')
price = models.IntegerField()
vendor = models.ForeignKey(User)
discount = models.IntegerField()
description = models.TextField(max_length=500)
discount_price = models.IntegerField()
stock = models.BooleanField(default=True, db_column='stock')
解决方案
您当前的 ORM 查询在数据库级别使用 AND 子句,因此您没有根据异常获得结果
尝试这个
from django.db.models import Q
objects = Tyre.objects.filter(Q(brand__name__in=brands) | Q(product_type__in=types) | Q(tyre_price__price__range=(min_price, max_price)))
推荐阅读
- javascript - React Material UI 模式未打开
- python - 在 Python 中拆分列后分配多个列名(400 列)的快速方法
- javascript - 从 C# 单元测试调用 Javascript 函数
- python - 使用单词列表从数据框中定位行
- unit-testing - 如何模拟被测同一类中的方法?
- utf-8 - 为什么即使设置了语言环境也会出现错误?
- apache - htaccess 仅限制对 index.php 的访问
- tasmota - 无论如何让tasmota模仿按钮点击?
- c# - 在结构中编组 C++ win32 类型以在 C# 中的函数中使用
- python - PyTube:PrivateVideo 异常不起作用