Почему мои два объекта django одного и того же типа ведут себя по-разному?

#python #django

#python #джанго

Вопрос:

Помогите!

У меня есть два объекта, которые я создал, используя разные методы в django;

 >>> from django.contrib.contenttypes.models import ContentType
>>> from myproject.models import Building
 

Метод A

 >>> content_type = ContentType.objects.get(app_label='myproject', model='Building')

>>> content_class = content_type.model_class()

>>> content_query = content_class.objects.raw("Select * from pms_building where name like '%build%' ")

>>> type(content_query)

<class 'django.db.models.query.RawQuerySet'>
>>> content_query[0]
# error ....
# Attribute: 'str' object has no attribute 'items'
 

Метод B

 >>> bld = Building.objects.raw("Select * from pms_building where name like '%build%' ")

>>> type(bld)

<class 'django.db.models.query.RawQuerySet'>

>>>bld[0]
<Building: Building A>
 

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

Гат

Комментарии:

1. Я предполагаю, что это будут два разных метода инициализации . Используйте dir(bld) и dir(content_query), чтобы увидеть, что они определили.

Ответ №1:

SQL-запрос выполняется только при вызове content_query[0] , поэтому в этот момент запрос завершится ошибкой, если, например, что-то content_class не так с. По крайней мере, я заметил, что вы забыли objects с первой строки:

 content_type = ContentType.objects.get(app_label='myproject', model='Building')
 

РЕДАКТИРОВАТЬ: я получаю ошибку «объект ‘str’ не имеет атрибута ‘items'», когда%-метки неправильно интерпретируются. Это исправило это для меня:

 s = "%build%"
content_query = content_class.objects.raw("Select * from pms_building where namelike %s", [s])
 

Комментарии:

1. РЕДАКТИРОВАТЬ не имеет значения, исправлено, пока я комментировал = P

2. извините за опечатку, я не включил «объекты», отредактировал вопрос, проблема все еще остается

3. @gath Оба метода работают для меня. Какую версию Django и DB вы используете?

4. @gath Я получил эту ошибку при использовании LIKE с%-chars , проверьте мою правку.