2010-10-06 3 views
1

я столкнулся со следующей проблемой, в основном я делаю это так:Джанго комплекс фильтрация связанных объектов

class Account(models.Model): 
    TraffPerMonth = models.IntegerField(default=0) 
    Tariff = models.ForeignKey('Tariff') 

class Tariff(models.Model): 
    InetTraff = models.IntegerField(default='0') 

и вот выбор:

for user in Account.objects.all(): 
    t_traff = long(user.Tariff.InetTraff) 
if u_traff >= t_traff: 
      #do something 
      pass 

это занимает некоторое время, в в большинстве случаев я теряю процессорное время, выполняя поиск через пользователей, которые не злоупотребляют своим лимитом. Вот простой SQL-запрос, который делает то, что мне нужно:

select ba.TraffPerMonth from billing_account ba , billing_tariff bt where ba.TraffPerMonth > bt.InetTraff group by ba.id; 

Как я могу выполнить запрос выше с помощью Django? Я пробовал поиск в google, но то, что я видел, является примером, если что-то NULL, и в моем примере мне нужно сравнить с некоторым значением.

Заранее спасибо.

ответ

4

Я не понимаю ваш SQL-запрос - вы группируете по account.TraffPerMonth, но выбираете одно значение, а не агрегат, что не имеет никакого смысла. И соединение также неверно.

Однако я предполагаю, что вы хотите присоединиться к пользователям к своим тарифам через ForeignKey и выбрать пользователей, которые использовали больше, чем их надбавку к тарифу. Это довольно просто:

accounts = Account.objects.filter(Tariff__InetTraff__gte=F('TraffPerMonth')) 

Вы должны использовать F() объект там, потому что вы сравниваете пункты в пределах одного (присоединенной) строку запроса, а не сравнивая элемент в запросе с константой.

Быстрый стиль: в Python вы должны использовать стиль lower_case_with_underscore для таких атрибутов, как поля модели, и резерв InitialCaps стиль для моделей и других классов.

+0

с F ('TraffPerMonth') он говорит: Файл "", строки 28, в NameError: имя 'F' не определен без - он ожидает, что буквальное, но не строка 'TraffPerMonth'. – onorua

+1

Вам нужно импортировать F: 'из django.db.models import F' –