Django: запрос с помощью F () в объект, который не ведет себя, как ожидалось - PullRequest
1 голос
/ 02 октября 2011

Я пытаюсь перейти в модель Price, чтобы сравнить цены, но столкнулся с неожиданным результатом.

Моя модель:

class ProfitableBooks(models.Model):
    price = models.ForeignKey('Price',primary_key=True)

На мой взгляд:

foo = ProfitableBooks.objects.filter(price__buy__gte=F('price__sell'))

Получение этой ошибки:

'ProfitableBooks' object has no attribute 'sell' 

1 Ответ

0 голосов
/ 03 октября 2011

Это ваша актуальная модель или упрощение? Я думаю, что проблема может заключаться в том, чтобы иметь модель, единственным полем которой является ее первичный ключ - внешний ключ. Если я попытаюсь разобрать это, то, по-видимому, это будет означать, что это, по сути, поле, действующее в качестве прокси-сервера для набора запросов - вы никогда не сможете получить более прибыльные книги, чем цены, из-за природы первичных ключей. Это также может означать, что в поле «Ваши книги» не должно быть совпадений цен из-за подразумеваемых ограничений уникальности.

Если я правильно понимаю, вы пытаетесь сравнить два значения в другой модели: price.buy и price.sell, и вы хотите узнать, прибыльна ли эта модель непоказанной книги или нет. Хотя я не совсем уверен, как именно здесь происходит разрушение объекта F (), моя интуиция заключается в том, что F () предназначен для облегчения своего рода эффективного запроса и обновления, когда вы сравниваете или корректируете значение модели на основе другого значения в база данных. Возможно, он не приспособлен для работы с такой моделью «оболочки», которая не имеет полей, кроме объединенного первичного / внешнего ключа и сравнения двух значений, как внешних по отношению к модели, из которой выполняется запрос (так и отличной от Книги). Я полагаю, модель, которая имеет идентифицирующую информацию о книгах).

В документации сказано, что вы можете использовать объединение в объекте F (), пока вы фильтруете, а не обновляете, и я предполагаю, что ваша ценовая модель имеет поле покупки и продажи, так что, похоже, оно подходит. Так что я не уверен на 100%, где это происходит за кулисами. Но с практической точки зрения, если вы хотите достичь именно того результата, который здесь подразумевается, вы можете просто выполнить простой запрос по вашей ценовой модели, опять же, в модели ProfitableBooks нет четких данных (она только возвращает цены), и Вы также подразумеваете, что у каждого price.buy и price.sell есть ровно одна соответствующая книга. Таким образом, Price.objects.filter (buy__gte = F ('sell')) дает результат, который вы запросили в своем урезанном.

Если вы хотите получить результаты, которые являются объектами книги, вы должны выполнить запрос, подобный тому, который вы получили здесь, но вместо этого начните с вашей модели Книги. Вы можете поместить этот запрос в менеджер наборов запросов, называемый «profitable_books», или что-то в этом роде, если хотите каким-то образом обосновать его.

...