Как отфильтровать атрибут внешнего ключа (список) во вложенном Django Rest? - PullRequest
0 голосов
/ 19 ноября 2018

Это модель, и необходимо реализовать атрибуты фильтра: 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')

1 Ответ

0 голосов
/ 19 ноября 2018

Ваш текущий запрос 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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...