2017-05-05 6 views
2

レールの世界から来て、私はミックスインについて知りました。私はセットは、mixinで動的に変更されました

基本ミックスインを設定

コア/ mixins.py

from django.db import models 
from django.contrib.auth.models import User 

class Timestamps(models.Model): 
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 

    class Meta: 
     abstract = True 

そしてコアの私のEventモデル/ MY_APP/models.py

from core import mixins as core_mixins 

class Event(core_mixins.Timestamps): 
    # ... 

すべてうまくいきますが、これを少し拡張してよりダイナミックなミックスインを作りたいと思ったらどうしますか?

高度なミックスイン

コア/ mixins.py

from django.db import models 
from django.contrib.auth.models import User 

from django.dispatch import receiver 
from django.db.models.signals import pre_save 
from cw_core.requestprovider.signals import get_request 

class Trackable(models.Model): 
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 

    created_by = models.ForeignKey(User, related_name='created_XXX') # <-- ??? 
    updated_by = models.ForeignKey(User, related_name='updated_XXX') # <-- ??? 

    class Meta: 
     abstract = True 

@receiver(pre_save, sender=Event) # <-- ??? 
def security_attributes(sender, instance, **kwargs): 
    request = get_request() 

    instance.updated_by = request.user 

    if instance.id is None: 
     instance.created_by = request.user 

コア/ MY_APP/models.py

私は動的に related_nameを設定する方法を
from core import mixins as core_mixins 

class Event(core_mixins.Trackable): 
    # ... 
  • ?私はfound this questionですが、文字列で使用できる変数が見つかりませんでした。ドキュメントはありますか?

  • また、@receiverコールで送信者を動的に設定するにはどうすればよいですか?

私の試みは設定して次のようになります。

@receiver(pre_save, sender=self.__class__) 

をしかし、私はこれが機能するかどうかわからないのですか?提案されたアプローチは何ですか?

+0

があります関連する名前) –

答えて

2

基本的には、信号プロセッサ内の送信者をフィルタリングすることができhttps://stackoverflow.com/a/17173716/3627387

@receiver(pre_save) 
def security_attributes(sender, instance, **kwargs): 
    if not issubclass(sender, core_mixins.Trackable): 
     return 
    request = get_request() 

    instance.updated_by = request.user 

    if instance.id is None: 
     instance.created_by = request.user 

ただ、既存の機能https://docs.djangoproject.com/en/1.11/topics/db/models/#abstract-related-name

class Trackable(models.Model): 
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 

    created_by = models.ForeignKey(User, related_name='created_%(class)s') 
    updated_by = models.ForeignKey(User, related_name='updated_%(class)s') 
    class Meta: 
     abstract = True 

を使用し、第二部のための解決策もあります。

また私はこの[ニートDOC]を見出さ `related_name`(https://docs.djangoproject.com/en/1.11/ref/models/options/#default-をRegariding django-model-utilshttps://django-model-utils.readthedocs.io/en/latest/models.html#timestampedmodel

+0

どこから "get_request"メソッドを取得できますか?それを提供する安定したライブラリはありますか? – foobar

+0

@foobar OPのコード 'from cw_core.requestprovider.signals import get_request'から来て、彼の質問を読んでください。彼の内部機能のように見える –

+0

@Sardorbek Imomalievはい、私はそれが彼のコードから来たと考えましたが、これを提供するライブラリがあるかどうか疑問に思っていました。よくある問題のようです – foobar

関連する問題