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 分

ijavascript

ijavascript https://n-riesco.github.io/ijavascript/index.html

2023年6月7日 · 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 分

HTML メール

HTML メール HTML メールの作り方を 5 分で解説!簡単に作成する方法もこっそり教えます。

2023年6月5日 · 1 分

color

HTML カラーコード/カラーネーム HTML カラーコード CSS カラーコード一覧 カラーネーム CSS3 色名 VSCode Peacock VSCode を自分の好きな色に染める

2023年6月1日 · 1 分

MySQL 半角カナ検索

utf8mb4_0900_ai_ci 「utf8mb4_0900_ai_ci」という照合順序は、MySQL 8.0 から標準になった照合順序で、Unicode 9.0 の文字セットをサポートしています。¹ この照合順序は、文字列の比較において、アクセントや大小文字を区別せずに比較することができます。¹ また、日本語のようなマルチバイト文字を含む文字列を扱う場合にも適しています。¹¹: MySQL 8.0 の照合順序で標準になった「utf8mb4_0900_ai_ci」とは - Qiita ソース: Bing との会話 2023/5/31 (1) MySQL 8.0 の照合順序で標準になった「utf8mb4_0900_ai_ci …. https://qiita.com/seltzer/items/8b5d8a61591e72715d5b. (2) MySQL :: MySQL 8.0 リファレンスマニュアル :: 10.5 …. https://dev.mysql.com/doc/refman/8.0/ja/charset-applications.html. (3) MySQL :: MySQL 8.0 リファレンスマニュアル :: 10.4 接続文字 …. https://dev.mysql.com/doc/refman/8.0/ja/charset-connection.html. 半角カナの濁点ありは照合順序の設定では解決できない utf8mb4_0900_ai_ci での検索: where 結果 ベル ヘル, ベル, ヘル (つまり、 ベル は一致しない) ヘル ヘル, ベル, ヘル (つまり、 ベル は一致しない) ヘル ヘル, ベル, ヘル (つまり、 ベル は一致しない) ベル ベル (のみ) django-filter: method フィルターで対応 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 from functools import reduce from operator import or_ import django_filters as DF import jaconv def filter_icontains_mix(queryset, name, value): """全角半角を区別しないで検索(濁点対応)""" if not value: return queryset values = set([jaconv.h2z(value), jaconv.z2h(value)]) def _query(v): return Q(**{f"{name}__icontains": v}) query = reduce(or_, map(_query, values)) return queryset.filter(query) class OrderFilter(DF.FilterSet): ... customer_name__contains = DF.CharFilter( field_name="customer_name", lookup_expr="icontains", method=filter_icontains_mix ) ...

2023年5月31日 · 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 分

pandas 指定カラムがnan以外のレコードのみ抽出

pandas: notna(): 指定カラムがnan以外のレコードのみ抽出 ダウンロードExcelファイルの 行数カラム に値がはいっているとエラー行: 1 2 3 4 5 6 names = { "行数": "line", "メッセージ": "message", } df = self.dataframe(response)[["行数", "メッセージ"]].rename(columns=names) df = df[df["line"].notna()]

2023年5月25日 · 1 分