#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’])