Мне нужно создать PDF-файл из указанного c запроса. Проблема в том, что я хотел бы показать, какие аргументы фильтра были использованы при создании этого файла PDF. Поэтому для лучшего понимания в моем проекте есть модель для транзакций:
class Transaction(Model):
class Meta:
db_table = 'transactions'
app_label = 'core'
default_permissions = ()
description = models.CharField(max_length=100, null=True)
amount = models.IntegerField(null=False)
Поля модели не заполнены, поскольку в этом нет необходимости. Эта модель имеет Тип и Фильтр классы:
class TransactionType(DjangoObjectType):
record = graphene.String(source='pk')
class Meta:
model = Transaction
interfaces = (Node,)
connection_class = TransactionPdfConnector
class TransactionFilter(django_filters.FilterSet):
record = django_filters.CharFilter(
field_name='pk',
lookup_expr='exact'
)
В моем проекте есть поля PK UUID, названные как записи. Таким образом, этот фильтр фильтрует в соответствии с типизированной строкой UUID как PK. Для лучшего понимания мой запрос выглядит следующим образом:
query{
transactions(
record: "52d820fb-8383-4a97-ab26-321b56dedc0"
){
pdfUrl
edges{
node{
record
amount
}
cursor
}
}
}
Очень важным полем в запросе является pdfUrl , которое будет возвращать URL в сгенерированный файл PDF. Так вот почему я имею в мета-классе объекта типа класс_соединения . Мне нужно было переопределить класс graphene.Connection , чтобы я мог добавить атрибут pdfUrl на определенном уровне в качестве ребер. Мой пользовательский класс connection_class выглядит так:
class TransactionPdfConnector(PdfConnector):
pdf_url = graphene.String()
class Meta:
abstract = True
def resolve_pdf_url(self, info, **kwargs) -> str:
objects = self.iterable
context = {'items': []}
for item in objects:
context['items'].append(
{
'description': item.description if item.description else '',
'amount': f'{(item.amount / 100):.2f}',
}
)
content = render_to_string('transaction_list.html', context)
pdf = HTML(string=content).write_pdf()
file_name = str(uuid.uuid4())
file_path = f'{settings.MEDIA_ROOT}pdf/transactions/{file_name}.pdf'
url = f'{settings.BASE_URL}{settings.MEDIA_URL}pdf/transactions/{file_name}.pdf'
with open(file_path, 'wb') as pdf_file:
pdf_file.write(pdf)
return url
Как вы можете видеть, я рендеринг контента (строка, содержащая визуализированный HTML), который использует переменные, переданные в качестве контекста. И что HTML строка библиотеки weasyprint конвертируется в PDF-байты. Эти байты, представляющие как pdf, я буду сохранять и возвращать этот URL в ответ на запрос. Но мне нужно перейти к контексту используемых аргументов фильтра в запросе. Но я не знаю, как это сделать правильно. У кого-нибудь есть идеи? Определение моего запроса выглядит следующим образом:
class GetTransactions(object):
transactions = DjangoFilterConnectionField(
TransactionType,
filterset_class=TransactionFilter,
)
Таким образом, класс фильтра передается в DjangoFilterConnectionField , и я не знаю, как передать аргументы фильтра из этого класса в мой класс Connection.
PS: простите за мой плохой Энгли sh.