コードリユースのためのモデル管理者におけるカスタム問い合わせセットの定義
Djangoクエリのデータベースにいくつかの行の行とSQLを書くことなく素晴らしい方法を提供します.しかし、あなた自身がプロジェクトでコード論理の同じ部分を繰り返しているとわかるとき、若干のケースがあります.🥶
私たちが新しいフィールドをモデルに加えたと言いましょう
ユーザがデータベース内の特定のオブジェクトを取得する要求を行うとする.
ソリッドロジックは次のようになります.
カスタムモデルマネージャは、開発者がモデルのための余分なメソッドを書くことができます.
例に戻ると、カスタムを作成しましょう
あなたは、2011年の公式文書の管理者についてもっと学ぶことができますDjango .
記事投稿bloggu.io . 無料でお試しください.
問題
私たちが新しいフィールドをモデルに加えたと言いましょう
public_id
に基づいてuuid4
.class Product(models.Model):
public_id = models.UUIDField(db_index=True, unique=True, default=uuid.uuid4, editable=False)
基本的にこれpublic_id
はid
オブジェクトがCRUD操作を実行します.ユーザがデータベース内の特定のオブジェクトを取得する要求を行うとする.
ソリッドロジックは次のようになります.
public_id = kwargs.get("public_id")
try:
product = Product.objects.get(public_id=public_id)
except ObjectDoesNotExist:
raise Http404("Product does not exist")
あなたが他のモデルをあなたのプロジェクトに加えるまでpublic_id
フィールドとは、コードロジックの同じ部分を繰り返す自分自身を見つける.解決策
カスタムモデルマネージャは、開発者がモデルのための余分なメソッドを書くことができます.
例に戻ると、カスタムを作成しましょう
Manager
クラス用Product
モデル.class ProductManager(models.Manager):
def get_object_by_public_id(self, public_id):
try:
instance = self.get(public_id=public_id)
return instance
except ObjectDoesNotExist as e:
raise e
class Product(models.Model):
public_id = models.UUIDField(db_index=True, unique=True, default=uuid.uuid4, editable=False)
objects = ProductManager()
そして、オブジェクトを取得するとき、コードは単に次のようになります.public_id = kwargs.get("public_id")
product = Product.objects.get_object_by_public_id(public_id)
データベースに他のモデルがあるなら、Shop
モデルまたはUser
モデルもpublic_id
フィールド.私たちはAbstractManager
クラス.class AbstractManager(models.Manager):
def get_object_by_public_id(self, public_id):
try:
instance = self.get(public_id=public_id)
return instance
except (ObjectDoesNotExist, ValueError, TypeError) as e:
raise e
class ShopManager(AbstractManager):
pass
class ProductManager(AbstractManager):
pass
class Product(models.Model):
public_id = models.UUIDField(db_index=True, unique=True, default=uuid.uuid4, editable=False)
objects = ProductManager()
class Shop(models.Model):
public_id = models.UUIDField(db_index=True, unique=True, default=uuid.uuid4, editable=False)
objects = ShopManager()
product = Product.objects.get_object_by_public_id(public_id)
shop = Shop.objects.get_object_by_public_id(public_id)
🚀🚀🚀あなたは、2011年の公式文書の管理者についてもっと学ぶことができますDjango .
記事投稿bloggu.io . 無料でお試しください.
Reference
この問題について(コードリユースのためのモデル管理者におけるカスタム問い合わせセットの定義), 我々は、より多くの情報をここで見つけました https://dev.to/koladev/define-custom-query-sets-in-model-managers-for-code-reuse-1emcテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol