#python #django #django-models #django-queryset #rawsql
#python #django #django-модели #django-набор запросов #rawsql
Вопрос:
У меня есть a model.Manager
, который запускает хранимую процедуру и a model.Model
для обработки возвращенных данных. Однако, когда данные возвращаются, они возвращаются не как a queryset
, а как список кортежей, и я не могу ссылаться на них по имени поля. Я хотел бы, чтобы результаты возвращались как queryset
.
models.py
class DashboardDetailManager(models.Manager):
def dashboardDetail(self, from_date, to_date):
from django.db import connections
# AD 11/10/2020 updated sproc to return multiple sets for easier handling
# was only returning the last set of expected results-->
raw_sql = f"EXEC dbo.spGetDashDetailData @formFromDate = '{from_date}', @formToDate = '{to_date}'"
with connections['ECS3'].cursor() as cursor:
cursor.execute(raw_sql)
detail_rows = []
for row in cursor.fetchall():
detail_rows.append(row)
while cursor.nextset():
for row in cursor.fetchall():
detail_rows.append(row)
return detail_rows
class DashDetailData(models.Model):
occurred = models.DateField(blank=True, null=True);
severity = models.CharField(max_length=3, blank=True, null=True)
batchid = models.CharField(max_length=255, blank=True, null=True);
hrefkey = models.CharField(max_length=255, blank=True, null=True)
email = models.EmailField(null=True, blank=True)
id_cst = models.IntegerField(null=True, blank=True)
docType = models.CharField(max_length=255, blank=True, null=True);
tpid = models.CharField(max_length=255, blank=True, null=True);
name_cst = models.CharField(max_length=255, blank=True, null=True);
message = models.CharField(max_length=255, blank=True, null=True);
attachment = models.CharField(max_length=255, blank=True, null=True);
bom_status = models.CharField(max_length=255, blank=True, null=True);
ack = models.CharField(max_length=255, blank=True, null=True);
bom_count = models.IntegerField(null=True, blank=True)
objects = DashboardDetailManager()
views.py
detail_rows = DashDetailData.objects.dashboardDetail('11-10-2020', '11-20-2020')
Комментарии:
1. Я думаю, вы ищете эту документацию .
2. Спасибо! Я читал документацию, пока мои глаза не пересеклись, но, похоже, я не могу разобраться в ней в своей голове. Надеялся на пример или фрагмент, чтобы я мог понять, что мне нужно.
3. Я перечитал его сегодня утром, и, насколько я понимаю, я не могу использовать его для выполнения sproc, чтобы использовать Manager.raw(), вам нужно передать идентификатор в select.
4. Дело в том, что вам придется участвовать в процессе, который с любовью называется «возиться»: попробовать что-то, посмотреть, каков результат, и настроить его или отбросить идею и начать все сначала. Хранимые процедуры по своей природе трудно абстрагировать, потому что то, что они делают, «зависит от процедуры». Все, что Django имеет в плане поддержки, — это немного . Итак, если вам действительно нужен набор запросов, вам придется погрузиться во внутренние компоненты Django и посмотреть, как Django его создает. Это будет в значительной степени зависеть от движка.
5. Глядя на внутренности, django.db.models. запрос. ModelIterable — это то, что делает все волшебство. Не кажется слишком сложным разбить его, чтобы он соответствовал вашей процедуре («знаменитые последние слова»).