python
  • django
  • 2016-12-31 7 views 4 likes 
    4

    初心者として質問があり、私はDjangoクラスのメタクラスの継承に関するコンセプトを探しています。次のモデルは、誰かが私を助けることができれば感謝しています。Djangoモデルでメタクラスを継承する

    class Base(models.Model): 
        code = AutoSlugField(_("Slug"), max_length=128, unique=True, 
             populate_from='name') 
        name = models.CharField(_("Name"), max_length=128, unique=True) 
        description = models.TextField(_("Description"), blank=True) 
        countries = models.ManyToManyField('Country', 
                 blank=True, verbose_name=_("Countries")) 
        is_discounted = False 
        class Meta: 
         app_label = 'shipping' 
         ordering = ['name'] 
         verbose_name = _("Shipping Method") 
         verbose_name_plural = _("Shipping Methods") 
    
    
    class OrderAndItemCharges(Base): 
        price_per_order = models.DecimalField(
         _("Price per order"), decimal_places=2, max_digits=12, 
         default=D('0.00')) 
        price_per_item = models.DecimalField(
         _("Price per item"), decimal_places=2, max_digits=12, 
         default=D('0.00')) 
        free_shipping_threshold = models.DecimalField(
         _("Free Shipping"), decimal_places=2, max_digits=12, blank=True, 
         null=True) 
        class Meta(Base.Meta): 
         app_label = 'shipping' 
         verbose_name = _("Order and Item Charge") 
         verbose_name_plural = _("Order and Item Charges") 
    

    トレースバック:私はクラスのインポートの動作を変更した

    class OrderAndItemCharges(Base): 
        File "C:\Users\AliKhan\supermarekt\market\shipping\models.py", line 46, in Or 
    derAndItemCharges 
        class Meta(Base.Meta): 
    AttributeError: type object 'Base' has no attribute 'Meta' 
    

    は、次のようにして乗り越えます。それが問題の原因になっている可能性があります。理由は、店舗のダッシュボードアプリケーションのコードを簡単にする必要があるということです。だから私は、DjangoのクラスをインポートするためのデフォルトのDjangoのソースをインポートし、以下のようにそれを変更:

    from django.apps.config import MODELS_MODULE_NAME 
    def get_class(module_label, classname): 
        return get_classes(module_label, [classname])[0] 
    def get_classes(module_label, classnames): 
        if not module_label: 
         raise ValueError(
          "Module Does Not Exists") 
    
        market_module_label = "%s" % (module_label) 
        market_module = _import_module(market_module_label, classnames) 
        return _pluck_classes([market_module], classnames) 
    def _import_module(module_label, classnames): 
        try: 
         return __import__(module_label, fromlist=classnames) 
        except ImportError: 
         __, __, exc_traceback = sys.exc_info() 
         frames = traceback.extract_tb(exc_traceback) 
         if len(frames) > 1: 
          raise 
    

    ファイル名はloading.pyと私はジャンゴ-オスカーからそれを学びました。しかし私は私の必要性のためにそれを調整するためにわずかな変更を加えました。だからここに問題があるかもしれない。助けてください

    +0

    それはこのように動作するために使用。この問題を引き起こす可能性があることを思い出してください... –

    +0

    上記の質問を更新しました。 –

    答えて

    7

    属性としてMetaクラスにアクセスするには、Baseクラス抽象クラスを宣言する必要があります。

    class A(models.Model): 
        class Meta: 
         app_label='yourapp' 
         abstract=True 
    
    class B(A): 
        class Meta(A.Meta): 
         db_table='yourtable' 
    

    関連ドキュメント:https://docs.djangoproject.com/en/1.10/topics/db/models/#meta-inheritance

    +1

    モデルはメタを継承するために抽象的である必要はありません – bozdoz

    関連する問題