Форум сайта python.su
35
Помогите с формированием запроса к базе средствами django. Необходимо получить queryset, содержащий все транзакции (Transaction) у которых владелец (Owner) клиента (Client) = Остап Бендер
Так выглядят модели:
class Transaction(models.Model): id = models.IntegerField(db_column='id') # <-- Тут id из таблицы clientdetails, но не всегда ...много полей... class Meta: managed = False db_table = 'transactions' class Client(models.Model): id = models.IntegerField(db_column='id', primary_key=True) name = models.CharField(db_column='name', max_length=50) ...много полей... class Meta: managed = False db_table = 'clientdetails' class Owner(models.Model): name = models.CharField(db_column='name', max_length=40) # <-- Тут name из clientdetails, но не всегда owner = models.CharField(db_column='owner', max_length=50) # <-- Тут много имен, среди которых нужен только Остап Бендер ...много полей... class Meta: managed = False db_table = 'owner'
select transactions.* from transactions join (select clientdetails.id, owner.owner from clientdetails join owner on clientdetails.name = owner.name where owner.owner = 'Остап Бендер') as t on t.id = transactions.id
Transaction.objects.extra(tables=['clientdetails', 'owner'], where=[u'''transactions.id = clientdetails.id and clientdetails.name = owner.name and owner.owner = %s'''], params=[u'Остап Бендер'])
Офлайн
568
Правильнее сделать raw-sql запрос.
Офлайн
35
У меня в модели Transaction уникальность гарантирует только связка из нескольких полей. Т.е. нет ни одного подходящего поля в которое можно прописать primary_key=True. Для работы с raw, на сколько я понимаю, необходим первичный ключ. Да и на выходе мне нужен queryset для дальнейших манипуляций…
Может все таки есть способы через queryset.extra() все это дело заставить корректно работать?
Офлайн
568
botinagДа с чего вдруг? raw он на то и raw, что там чистый как слеза девственницы sql, джойни по чему угодно.
Для работы с raw, на сколько я понимаю, необходим первичный ключ
botinagэто каких таких манипуляций?
и на выходе мне нужен queryset для дальнейших манипуляций…
Офлайн
35
Вообще передо мной стоит задача правильно отфильтрованные транзакции вывести в удобную таблицу с помощью django-tables2.
Для этого я в своей вьюхе отнаследовался от SingleTableView и пытаюсь передать в качестве queryset
Transaction.objects.raw(u'''select transactions.* from transactions join (select clientdetails.id, owner.owner from clientdetails join owner on clientdetails.name = owner.name where owner.owner = 'Остап Бендер') as t on t.id = transactions.id''')
data must be QuerySet-like (have count and order_by) or support list(data) -- RawQuerySet has neither
[x.id for x in Transaction.objects.raw(u'''select transactions.* from transactions join (select clientdetails.id, owner.owner from clientdetails join owner on clientdetails.name = owner.name where owner.owner = 'Остап Бендер') as t on t.id = transactions.id''')]
InvalidQuery: Raw query must include the primary key
Офлайн
568
botinagХосспаде, зачем????? Возьмите любой JS-grid и работайте в рамках концепции MVC. За такие велосипеды надо лишать прав человека.
вывести в удобную таблицу с помощью django-tables2
Офлайн
35
модифицировал модель транзакций
class Transaction(models.Model): id = models.IntegerField(db_column='id', primary_key=True) # <-- Тут id из таблицы clientdetails, но не всегда ...много полей... class Meta: managed = False db_table = 'transactions' unique_together = (('id', 'другие', 'поля''),)
[x.id for x in Transaction.objects.raw(u'''select transactions.* from transactions join (select clientdetails.id, owner.owner from clientdetails join owner on clientdetails.name = owner.name where owner.owner = 'Остап Бендер') as t on t.id = transactions.id''')]
FishHookДля остальных моделей (без хитрых фильтраций queryset) настроил. Работает. Устраивает.
Хосспаде, зачем?????
FishHookВ будущем ознакомлюсь. С js у меня хуже чем с питоном.
Возьмите любой JS-grid и работайте в рамках концепции MVC
Офлайн