2015-02-04 3 views
4

Вот моя модель Django:Как фильтровать Django Queryset в дополнительном поле?

from django.db import models 
class MyModel(models.Model): 
    a = models.IntegerField() 
    b = models.IntegerField() 
    c = models.IntegerField() 

Я хочу, чтобы извлечь все экземпляры этой модели, в которой a = 5 и b + c > 10. Как мне это сделать?

Когда я пытаюсь это:

print MyModel.objects.filter(a=5).extra(
    select={"total_count": "b + c"}, 
    where=["total_count > 10"], 
) 

Я получаю эту ошибку:

OperationalError: (1054, "Unknown column 'total_count' in 'where clause'") 

ответ

2

Вы можете превратить b + c > 10 в b > 10 - c, а затем использовать F built-in function

MyModel.objects.filter(a=5).filter((b__gt=10-models.F('c')) 

Использование Django extra() не совсем безопасно

You should be very careful whenever you use extra(). Every time you use it, you should escape any parameters that the user can control by using params in order to protect against SQL injection attacks . Please read more about SQL injection protection.

1

В Джанго 1.7 этот фильтр работает отлично и выдает следующий запрос:

SELECT (b + c) AS "total_count", "app_mymodel"."id", "app_mymodel"."a", 
     "app_mymodel"."b", "app_mymodel"."c" 
FROM "app_mymodel" 
WHERE ("app_mymodel"."a" = 5 AND (total_count > 10)) 

Можете ли вы скопировать запрос с именами реальных полей? Может быть, вы что-то угадали?