Как фильтровать модели django на основе полей продукта?

Я пытаюсь выполнить команду фильтрации, используя связанные поля; и не знаю, как это сделать:

class Listing(models.Model):
    name = models.CharField(max_length=150)
    slug = models.SlugField()
    description = models.TextField()
    catchphrase = models.TextField(null=True, blank=True)
    picture_0 = models.ImageField(upload_to = "mainimages")
    picture_1 = models.ImageField(null=True, blank=True, upload_to = "./product/static/product/imgs")
    picture_2 = models.ImageField(null=True, blank=True, upload_to = "./product/static/product/imgs")
    short_term_price = models.IntegerField(default=0)
    long_term_price = models.IntegerField(default=0)
    tax = models.IntegerField(default=0)
    tag = models.ForeignKey('Tag', on_delete=models.PROTECT)

    def __str__(self):
        return self.name

class Order(models.Model):
    listing = models.ForeignKey(Listing, on_delete=models.PROTECT)
    customer = models.ForeignKey(Customer, on_delete=models.PROTECT)
    lease_date = models.DateField()
    clear_date = models.DateField()
    price = models.IntegerField(default=0) #cents

    def __str__(self):
        return self.listing.name
    
    def get_display_price(self):
        return "{0:.2f}".format(self.price / 100)

Общая идея заключается в том, что пользователь указывает начальную и конечную дату, а Django возвращает только те объявления, которые еще не были упорядочены в этот промежуток времени. Я не знаю, как поступить с функцией просмотра:

def search_products(request, start_date, end_date):
    listing = Listing.objects.select_related('order').all()

Я дам ответ, как если бы вы использовали lease_date для фильтрации. Есть несколько способов добиться этого. Один из них следующий:

listing_qs = Listing.objects.filter(
pk__in=Order.objects.exclude(lease_date__range(start_date,end_date)).select_related('listing').values_list('listing__pk')
)

Кодовая разбивка:

  • получите заказы, исключив те, дата аренды которых находится между указанными временными рамками
  • .
  • выбирая пк листинга (через values('listing__pk')), вы можете выбрать любой другой атрибут, который вам нужен
  • используя результат двух предыдущих инструкций, получить Listing объекты, так как у нас есть список пк.

Другой способ: Просто исключите все объекты Листинга, дата аренды которых находится между указанными временными рамками

Listing.objects.exclude(order_set__lease_date__range=(start_date,end_date))

Надеюсь, это поможет.

Вернуться на верх