2010-11-22 3 views
0

У меня есть следующие модели Django -Django модели ссылочное поле Match

class M(models.Model): 
    ... 
    disp_name = models.CharField(max_length=256, db_index=True) 
    ... 

class XX(models.Model): 
    x = models.ForeignKey(User) 
    y = models.ForeignKey(M, unique=True) 

Теперь в моем views.py, я хочу сделать частичное совпадение строки по всем пунктам в XX с полем y.disp_name.

Обычно можно было бы сделать это - M.objects.filter(disp_name__istartswith='string')

Но здесь M является ForeignKey в Model XX. Так что если я сделаю XX.objects.filter(y.disp_name__istartswith='string'), я получаю сообщение об ошибке.

Кроме того, это тоже не удается - u = User.objects.get(id=1) u.xx_set.filter(y.disp_name__istartswith='string')

Exception, что я получаю говорит это - SyntaxError: keyword can't be an expression (<console>, line 1)

Как это сделать?

ответ

2

Хотелось бы, чтобы вы использовали правильные имена полей, а не X, Y и M - это действительно сложно.

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

XX.objects.filter(y__disp_name__istartswith='string') 

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

+0

Извините, правила компании. Спасибо, это решило проблему! Итак, django разделяет часть LHS на '__' и использует ее как поля? –

+1

Да, в значительной степени, хотя, естественно, это сложнее, чем из-за необходимости отличать соединения от типа поиска ('in',' istartswith' и т. Д.). Если вам интересно, посмотрите код в 'django.db.models.sql.query.Query.add_filter'. –

Смежные вопросы