django-import-export M2M

django-import-export M2M, FK django-import-export, importing ManyToMany from XLSX Widgets GroupWidget どちらでも使える: Users.groups Permission.group_set 1 2 3 4 5 6 7 8 9 10 11 12 from import_export import widgets, fields class GroupWidget(widgets.ManyToManyWidget): def clean(self, value, row=None, *args, **kwargs): if not value: return self.model.objects.none() if self.field == "name": # 存在しない場合作成する ids = value.split(self.separator) ids = filter(None, [i.strip() for i in ids]) return map(lambda i: self.model.objects.get_or_create(name=i)[0], ids) return super().clean(self, value, row=row, *args, **kwargs) ContentTypeWidget Permission.content_type など ForeingKey 定義されていると使える データは {app_label}.{model} でレンダリングされるので、取り込む時に split('.') する 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 from import_export import fields, widgets from django.contrib.contenttypes.models import ContentType class ContentTypeWidget(widgets.ForeignKeyWidget): def clean(self, value, row=None, *args, **kwargs): if value is None: return None app_label, model = value.split(".") content_type = ContentType.objects.get_by_natural_key(app_label, model) return content_type def render(self, value, obj=None): return f"{value.app_label}.{value.model}" User.groups User の Resource を定義するにあたって、groups を name で import/export するには、以下のように記述することができます。 ...

2023年6月9日 · 2 分

django グループに権限を付与

Django: 指定したグループに権限を与える 1 2 3 4 from itertools import product from django.contrib.auth.models import Permission, Group from django.contrib.contenttypes.models import ContentType from django.apps import apps 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 @main.command() @click.argument("group_name") @click.argument("model_path") @click.argument("action_suffix", nargs=-1) # view とか view_other とか @click.pass_context def group_add_perms(ctx, group_name, model_path, action_suffix): """指定したグループに権限を与える""" group = Group.objects.get(name=group_name) app_label, model_name = model_path.split(".") if app_label == "*": model_list = apps.get_models() else: model_list = list( filter( lambda i: model_name == "*" or i._meta.model_mame == model_name, apps.get_app_config(app_label).get_models(), ) ) actions = map(lambda i: i.split("_"), action_suffix) def _perm(item): model_class, actions = item content_type = ContentType.objects.get_for_model(model_class) codename = ( f"{actions[0]}_{content_type.model}_{actions[1]}" if len(actions) > 1 else f"{actions[0]}_{content_type.model}" ) return Permission.objects.filter(content_type=content_type, codename=codename).first() perms = filter(lambda i: i is not None, map(_perm, product(model_list, actions))) group.permissions.add(*perms)

2023年6月8日 · 1 分

銀行マスター

django-import-export で 銀行マスターを取り込む 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 from import_export import resources from .. import models class BankCodeResource(resources.ModelResource): class Meta: model = models.BankCode import_id_fields = ["code", "branch_code"] fields = ["code", "branch_code", "kana", "name", "branch_kana", "branch_name"] def before_import_row(self, row, row_number=None, **kwargs): for field in self._meta.fields: # ヘッダーは verbose_name に合わせている value = row.pop(self._meta.model._meta.get_field(field).verbose_name, None) if value is None: continue # コードは0埋めする if field == "code": value = str(value).zfill(4) elif field == "branch_code": value = str(value).zfill(3) row[field] = value

2023年6月8日 · 1 分

pandas MySQL

pandas: MySQL sqlalchemy で mysqlclient を使うには、まず mysqlclient をインストールする必要があります。次に、SQLAlchemy のエンジン構成で mysqlclient を使用するように設定します。以下は、Qiita の記事 ¹ からの例です。 1 2 3 from sqlalchemy import create_engine engine = create_engine('mysql+mysqldb://user:password@host/dbname', echo=True) また、CData Python Connector for MySQL³ を使用することもできます。これは、SQLAlchemy ORM を使用して Python で MySQL データに連携するためのドライバです。 1 2 from sqlalchemy import create_engine engine = create_engine("mysql+mysqlconnector://user:password@host/dbname") どちらの方法でも、SQLAlchemy で MySQL に接続することができます。 ソース: Bing との会話 2023/6/7 (1) 【Python】SQLAlchemy で MySQL に接続する - Qiita. https://qiita.com/curry__30/items/432a21426c02a68e77e8. (2) SQLAlchemy ORM を使って、Python で MySQL データに連携 …. https://www.cdata.com/jp/kb/tech/mysql-python-sqlalchemy.rst. (3) 【Python】SQLAlchemy を試してみる - Qiita. https://qiita.com/ktamido/items/ebdbe5a85dbc3e6004ae. django .env に django の DATABASE_URL が定義されているとする ...

2023年6月7日 · 1 分

django session

Sessionのユーザーの取得 Djangoでセッションレコードがどのユーザーのものかを判定するには、以下のようにします。 1 2 3 4 5 6 7 8 from django.contrib.sessions.models import Session from django.contrib.auth.models import User for session in Session.objects.all(): uid = session.get_decoded().get('_auth_user_id') if uid: user = User.objects.get(id=uid) print(user.username) 参考文献: Django ドキュメント | セッションの使いかた ソース: Bing との会話 2023/5/30 (1) セッションの使いかた | Django ドキュメント | Django. https://docs.djangoproject.com/ja//2.2/topics/http/sessions/. (2) 【Django】ログイン判定機能の実装方法を実例付きで徹底解説. https://itc.tokyo/django/dynamic-links-by-user-info/. (3) Djangoで現在ログインしているユーザーのユーザーIDを取得する方法. https://qastack.jp/programming/12615154/how-to-get-the-currently-logged-in-users-user-id-in-django. SessionStoreをつかう 1 2 3 4 5 6 7 from django.contrib.sessions.backends.db import SessionStore key = "3gsbhdfm4g2uyyieaaxl1omor2p5f1on" store = SessionStore(session_key=key) store["ssout_required"] = True store.save()

2023年5月30日 · 1 分

django-import-export

django-import-export django-import-export = "^2.4.0" settings.py 1 2 3 4 5 INSTALLED_APPS += [ ... "import_export", ... ] resources.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 from import_export import resources from .. import models class DepartmentResource(resources.ModelResource): class Meta: model = models.Department import_id_fields = ["code", "company_code"] # 複合キー exclude = ["company", "jobposts", "origin", "status"] # 除外 def get_instance(self, instance_loader, row): instance = super().get_instance(instance_loader, row) exclude = [] if instance: exclude += ["is_m03", "is_tmb"] # 更新除外 list(map(lambda i: row.pop(i, None), exclude)) return instance admin.py 1 2 3 4 5 6 7 8 9 10 11 12 13 from import_export.admin import ImportExportActionModelAdmin from . import inlines, resources class BaseModelAdmin(ImportExportActionModelAdmin): exclude = ["created_at"] readonly_fields = ["updated_at"] @admin.register(models.Department) class DepartmentAdmin(BaseModelAdmin): ... resource_class = resources.DepartmentResource

2023年5月18日 · 1 分

Django Subquery

Subquery 合計値のアノテート サブクエリの合計値: 合計対象レコードを OuterRefで条件指定してして絞り込む values() で ユニークフィールドで GROUP BY する 対象フィールドの合計値をanotate する アノテートしたフィールドを values() で ValueList にしてSubqueryで返す(1件のはず) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 def verify(): from django.db.models import OuterRef, Subquery, F from django.db.models.functions import Coalesce from base.models.utils import aggr_sum_decimal as D from decimal import Decimal ref_query = dict( book__company_code=OuterRef("company_code"), book__processing_month=OuterRef("processing_month"), account_code=OuterRef("account_code"), account_item_code=OuterRef("account_item_code"), advances_code=OuterRef("outsource_code"), advances_branch_code=OuterRef("outsource_branch_code"), ) def bookitem_sum(bookitem): qs = ( bookitem.objects.filter(**ref_query) .values(*ref_query.keys()) .annotate(total=D("amount")) .values("total") ) return Subquery(qs) qs = models.CostOutsource.objects.annotate( sum_debit=Coalesce(bookitem_sum(BookDebit), Decimal("0")), sum_credit=Coalesce(bookitem_sum(BookCredit), Decimal("0")), ).exclude(debit_amount=F("sum_debit"), credit_amount=F("sum_credit")) Bing Djangoのクエリセットで、別のテーブルのフィールドの合計値をSubqueryを使ってannotateすることができます¹。以下は、例です。 ...

2023年5月17日 · 1 分

DRF: Content Negotiation

DRF: Content Negotiation DefaultContentNegotiation content_negotiation_classをカスタマイズするには、以下のようにします。 1 2 3 4 5 6 from rest_framework.negotiation import DefaultContentNegotiation class MyContentNegotiation(DefaultContentNegotiation): def select_renderer(self, request, renderers, format_suffix=None): # ここに処理を書きます。 pass 上記の例では、DefaultContentNegotiationを継承しています。 select_renderer()メソッドには、レンダラーを選択するための処理を書きます。 このメソッドは、リクエストオブジェクト、レンダラーのリスト、およびフォーマットサフィックスを引数として受け取ります。 ソース: Bing との会話 2023/5/12 (1) Content negotiation - Django REST framework. https://www.django-rest-framework.org/api-guide/content-negotiation/. (2) Django REST Framework - Content negotiation - HTTPは …. https://runebook.dev/ja/docs/django_rest_framework/api-guide/content-negotiation/index. (3) Django REST framework カスタマイズ方法 - チュートリアルの補足. https://qiita.com/okoppe8/items/c58bb3faaf26c9e2f27f. ViewSetでの設定 ViewSetごとにcontent_negotiation_classを設定することができます。 ...

2023年5月12日 · 1 分

jupyter: Django

Jupyter: Django 準備 django_extensions , notebookを入れておく settgins.py: 1 INSTALLED_APPS += ['django_extensions'] VSCode VSCodeでJupyterのPythonランタイムを選んでから以下を実行する 環境変数で、DJANGO_ALLOW_ASYNC_UNSAFE=true をセットしておく(.envとか) 1 2 3 4 5 6 import sys, os, django BASE_DIR = "path_ot_manage_py" sys.path.insert(0, BASE_DIR) os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings") django.setup() リモートサーバー autossh でポートフォワード PCの 8.8.8.8 -> リモート(EC2とか)の 8.8.8.8 にフォワードする: 1 autossh -M 0 -F .secrets/ssh.ec2.conf server -N -L 8888:localhost:8888 -4 カーネル起動 1 DJANGO_ALLOW_ASYNC_UNSAFE=true python manage.py shell_plus --notebook URLが表示されるので、ブラウザでアクセスする ...

2023年5月5日 · 1 分

redis

redis Ubuntu 1 sudo apt update && sudo apt install redis-server -y 1 2 $ ps ax | grep redis 1083463 ? Ssl 0:00 /usr/bin/redis-server 127.0.0.1:6379 redis-cli redis-cliコマンドでデータベース1に接続するには、次のように入力します。¹² redis-cli -n 1 このコマンドは、データベース1に接続するためのものです。-nオプションを使用して、データベース番号を指定します。 上記の例では、データベース番号が1であることを示しています。 ソース: Bing との会話 2023/5/5 (1) redis-cliの接続時によく使うコマンド使い方メモ - Qiita. https://qiita.com/a-nishimura/items/54b0d85dbce47685a36f. (2) 【入門】Redis - Qiita. https://qiita.com/wind-up-bird/items/f2d41d08e86789322c71. (3) redis-cliの使い方 - Qiita. https://qiita.com/sawada_masahiko/items/1f60936c421ecab8dfbf. (4) redis-cliでよく使うコマンド20選 - Qiita. https://qiita.com/hatsu/items/a52817364160e0b6bb60. (5) Redisコマンド一覧 - Qiita. https://qiita.com/taiba/items/18016906d80c13e88853. (6) リモート環境にあるRedisに接続する - 箱のプログラミング日記。. https://www.y-hakopro.com/entry/2020/10/31/185235. Django 1 poetry add django-redis settings.py: ...

2023年5月5日 · 1 分