コードリユースのためのモデル管理者におけるカスタム問い合わせセットの定義


Djangoクエリのデータベースにいくつかの行の行とSQLを書くことなく素晴らしい方法を提供します.しかし、あなた自身がプロジェクトでコード論理の同じ部分を繰り返しているとわかるとき、若干のケースがあります.🥶

問題


私たちが新しいフィールドをモデルに加えたと言いましょうpublic_id に基づいてuuid4 .
class Product(models.Model):
    public_id = models.UUIDField(db_index=True, unique=True, default=uuid.uuid4, editable=False)
基本的にこれpublic_idid オブジェクトが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 . 無料でお試しください.