2012-03-12 12 views
0

は、私はモデルの名前として3つの数字のベクトルを持っています。 つまり12-1-120 12-1-139 12-1-9など保存と発注

モデルのインスタンスを降順で並べ替えるには、Djangoを使用して12-1-139,12-1-120 、12-1-9。

それは常にそれゆえ12-1-9、12-1-139、12-1-120を表示し、文字列のような働きを除き。

私は「CommaSeparatedIntegerField」を使用してみましたまだそれは全く役に立たないですし、今でも同じように動作します。

技術的に働くだろう私の知っている唯一の方法は、3つの別々の「IntegerFieldと」sのと私はあまりにも非現実的だと思う組み合わせ、でそれを注文することです。

任意のポインタ、または私はこの非現実的な方法で立ち往生していますか?

私は時には文字列を使ってこのオブジェクトを呼び出す必要があることを忘れていました。文字列をintに絶えず変換したくないので、他の方法でint型の束を格納しました。計算されたフィールドの幾分かを使用しています。

ここに私の基本的なコードです:

class MyModelName(models.Model): 
    name = models.CharField(max_length=15) 
    x = models.IntegerField(max_length=200) 
    y = models.IntegerField(max_length=200) 
    z = models.IntegerField(max_length=200) 

    def save(self, *args, **kwargs): 
     self.name = '-'.join([str(self.x), str(self.y), str(self.z)]) 
     super(MyModelName, self).save(*args, **kwargs) 

    class Meta: 
     ordering = ["-x","-y","-z"] 
+0

なぜ3つの整数フィールドを持つのは実際的ではありませんか? –

+0

私はちょうどそれが単一のフィールドにそれを格納するために多くのneaterだろうと思った。私は後の文字列を与えられたこの事をget_or_createしたい場合 –

答えて

2

3つの整数フィールドが移動するための方法です。

あなたがそのように、あなたのオブジェクトに名前を付けたい場合は、常にあなたのモデルにユニコード機能を追加することができます...

class Thing(models.Model): 
    x = models.IntegerField() 
    y = models.IntegerField() 
    z = models.IntegerField() 

    def __unicode__(self): 
     """ 
      Return a human-readable representation of the object. 
     """ 
     return '-'.join(self.x, self.y, self.z) 

https://docs.djangoproject.com/en/dev/ref/models/instances/#unicode

get_or_create例:

s = '12-1-9' 
x, y, z = [int(c) for c in s.split('-')] 
thing, created = Thing.objects.get_or_create(x=x, y=y, z=z) 

カスタム取得または作成メソッド

class ThingManager(models.Manager): 

    def from_string(s): 
     x, y, z = [int(c) for c in s.split('-')] 
     obj, created = self.get_or_create(x=x, y=y, z=z) 
     return obj, created 


class Thing(models.Model): 
    objects = ThingManager() 
    # Snip 


-- 


my_new_thing, created = Thing.objects.from_string('12-1-9') 
+0

が、私は何をするだろう「$ x軸$ y軸$ Z」すなわち「12-1-9」は が自動的に計算されたフィールドを持ってする方法はあります3つの整数を組み合わせた文字列? –

+0

get_or_createを呼び出す前に文字列を整数に分割してください。上記のサンプルコードを追加しました。 –

+0

私はget_or_createメソッドをたくさん使っています。そのような分割メソッドを常に行うのは面倒で遅いと思います。 –