2016-05-21 7 views
2

私が獲得しようとしている構造は、 FooモデルとFooxモデルがあります。フィールドのように動作するdjangoモデルのメソッド

class Foo(models.Model): 
    ... 

class Foox(models.Model): 
    foo = models.Foreignkey(Foo) 
    stext = models.CharField(max_length=80, verbose_name='description') 
    langu = models.ForeignKey(Langutable, verbose_name='Language') 

私は

は{{私が使用Foo.stextを貸し付け、STEXTフィールドFooxモデル、 私はアクティブ(EN)言語を使用して、Fooのモデルを持っており、テンプレートやコードにはFooのSTEXTフィールドを使用します}}テンプレート内にあります。値は、 Foox.objects.get(foo = foo、langu = 'en')。values( 'stext')[0] ['stext']を使用して決定されます。

私のコードにfoo.stext 。私のモデルは、stextがFooxモデルからの属性であることを知っていなければなりません。

はこれまでのところ、私は

def __unicode__(self): 
    stext = '' 
    try: 
     from panbas.models import Langutable 
     langu = Langutable.objects.get(langu='en') 
     xtablelookup = '{}{}'.format(self.__class__.__name__.lower(), 'x') 
     if xtablelookup in model_util.get_one_to_many_field_names(self.__class__):#I check if there is a Foox model, model_util function does that, returns ['foox'] 
      stext = self.foox_set.filter(langu=langu).values('stext')[0]['stext'] 
    except: 
     pass 
    return '{} {}'.format(self.short_cut, stext)#finally stext came from foox table. 

は私のアプローチは正しいです私のUnicodeのこのコードの下に使用を達成し、それを行うには良い方法があります。私は実際にフィールドを定義する方法が必要で、他のモデルに照会します。 dbには存在しません。ちょうどプレースホルダまたは何か。

私たちはモデルマネージャーとクラスメソッドを持っています。私はそれを理解できません。

私は他の多国間アプローチを知っています。私はそれらを使用するよう勧めません。

+0

それ以外の場合は、ユニコードバージョンを取得するたびにインポートされますが、これはおそらく非効率です。 –

+0

ありがとう@PaulCollingwood、ちょうど実験と私はこのアプローチを使用することを決めた場合は書き直されます。 – durdenk

+0

[プロパティ](https://docs.python.org/3/library/functions.html#property)のように聞こえます。 –

答えて

0

デコレータ@propertyを使用すると、変換された値を取得して更新することができます。

class Foox(models.Model): 
    foo = models.Foreignkey(Foo) 
    stext = models.CharField(max_length=80, verbose_name='description') 
    langu = models.ForeignKey(Langutable, verbose_name='Language') 


class Foo(models.Model): 
    ... 

    @property 
    def stext(self): 
     return Foox.objects.get(foo=self, langu=settings.LANGUAGE_CODE).stext 

    @stext.setter 
    def stext(self, value): 
     obj = Foox.objects.get_or_create(foo=self, langu=settings.LANGUAGE_CODE) 
     obj.stext = value 
     obj.save() 
関連する問題