Django Orm gteater больше, чем список целых чисел

#python #django #django-rest-framework #django-orm

#python #django #django-rest-framework #django-orm

Вопрос:

Я пытаюсь преобразовать запрос sql join в django orm, не совсем понимая, как это сделать.

Модели

     class Author(models.Model):
        author_name = models.CharField(
            verbose_name='Author', primary_key=True, max_length=250)
    
        country = models.CharField(verbose_name='Country', 
                                    null=False, blank=False,
                                    max_length=250)
    
        def __str__(self):
            return self.author_name
    
    
    class Publisher(models.Model):
        publisher_name = models.CharField(
            verbose_name='Publisher', primary_key=True, max_length=250)
    
        pub_add = models.TextField(verbose_name='Address', blank=False, null=False)
    
        def __str__(self):
            return self.publisher_name
    
    
    
    
    class Book(models.Model):
        isbn        = models.IntegerField(verbose_name='ISBN', 
                                        primary_key=True)
    
        title       = models.CharField(verbose_name='Title',
                                        unique=True,
                                        blank=False,
                                        null=False,
                                        max_length=250)
    
        pub_year    = models.IntegerField(verbose_name='Publish Year',
                                        blank=False, 
                                        null=False)
    
        unit_price  = models.IntegerField(verbose_name='Unit Price', 
                                        blank=False, 
                                        null=False)
        
        authors      = models.ForeignKey(Author,
                                        verbose_name='Author of book',
                                        on_delete=models.DO_NOTHING)
    
        publishers   = models.ForeignKey(Publisher, 
                                        verbose_name='Publisher of book', 
                                        on_delete=models.DO_NOTHING)
  

Sql-запрос
select distinct B1.title from Book B1, Book B2 where B1.unit_price > B2.unit_price and B2.pub_year = 2004;

запрос django, который я пробовал

         qs = Book.objects.filter(
            pub_year=2004
        )

        qs = Book.objects.filter(
            unit_price__gt__in=qs
        )
  

Это выдает эту ошибку

введите описание изображения здесь

Я чувствую, что это на самом деле очень, очень просто, и мне не хватает какой-то очевидной вещи, любое руководство будет полезно.

Спасибо.

РЕДАКТИРОВАТЬ 1:

я возился с этим, придумал это

 price_list = Book.objects.filter(
    pub_year=2004
).values_list('unit_price', flat=True)

price_list = list(price_list)

price_list = sorted(price_list)

# qs = Book.objects.filter(
#     unit_price__gt__in=qs
# )

# return qs

qs = Book.objects.filter(unit_price__gt=price_list[0])

return qs
  

чувствую, что это действительно неэффективно

Комментарии:

1. Я не уверен, что понимаю, что вы пытаетесь здесь проверить. Предположим, у вас есть 10 разных цен в price_list. [10, 20, 30, 40…] Вы хотите, чтобы вся книга стоила меньше 10? или вам нужны все книги, которые находятся в диапазоне от 10 <=book <= 100

2. то, что я пытаюсь сделать, это «отобразить книги, цена которых превышает хотя бы одну книгу, опубликованную в 2004 году», я написал для нее запрос sql join

3. По крайней мере, одна книга означает «самую дешевую» книгу. почему бы не выбрать самую дешевую книгу в 2004 году и выбрать все книги, цена которых выше этой?

4. что я хочу сделать, так это получить ЛЮБУЮ книгу из таблицы boss, цена которой превышает хотя бы одну книгу, опубликованную в 2004 году, поэтому больше, чем подойдет любой из элементов в списке.

5. Я предоставлю ответ с примером кода

Ответ №1:

После обсуждения в комментариях кажется, что достаточно изменить условие на, извлеките любую книгу из таблицы книг, чтобы ее цена была выше, чем у любой книги, опубликованной в 2004 году.

Это можно сделать следующим образом: min_unit_price =

 book_with_lowest_price_in_2004 = Book.objects.filter(pub_year=2004).aggregate(Min('unit_price')).get('unit_price__min']) # will provide the book with the lowest price in 2004
books_results = Book.objects.filter(unit_price__gt=book_with_lowest_price_in_2004)
  

Комментарии:

1. Спасибо, отлично! я забыл об агрегате и минимальном значении, которое вы получили с опечаткой (‘unit_price__min’])