2011-12-14 3 views
0

これはあまりにも醜いことではないと思いますが、私はPHPからDjangoに移行し始めましたが、私はモデルの周りを頭で覆そうとしています。これにアプローチする方法を見つけ出す。ここでMetaクラスを使用してManyToManyFieldから部品のリストを表示

は私がやろうとしているものです:

1)新しい「設定」(16ギガバイトを言ってRamConfig.sizeを設定)

2)を作成します含めるようにサイズとSIZE_CHOICESからの数量た選択16GBの設定では、たとえば、16GBの「設定」に2つの2GBの「パーツ」を追加したとします。

3)設定を保存します。

上記はうまくいきましたが、今では(8)2GBの「パーツ」を持つ16GBのRamConfigがあります。 RamConfig.servermodelがAsset.Servermodelsにある「Asset」モデルから、これらの2GBパーツのそれぞれにアセットを参照させたいと思います。

したがって、16GBの「config」をプルアップすると、2GBの「パーツ」ごとに使用可能なすべてのアセットが表示されます。これをモデルやテンプレートで行うべきかどうかは本当に分かりません。私はちょうどそれが今のところadminで適切に機能するようにしようとしています。任意のヒントについて

from django.db import models 

class Manufacturer(models.Model): 
    name = models.CharField(max_length=20,unique=1) 
    def __unicode__(self): 
     return self.name 

class ServerModel(models.Model): 
    name = models.CharField(max_length=20,unique=1) 
    manufacturer = models.ForeignKey(Manufacturer) 
    def __unicode__(self): 
     return "%s %s" % (self.manufacturer, self.name) 

class Asset(models.Model): 
    SIZE_CHOICES = (
     ('512MB', '512MB'), 
     ('1GB', '1GB'), 
     ('2GB', '2GB'), 
     ('4GB', '4GB'), 
     ('8GB', '8GB'), 
     ('16GB', '16GB'),) 
    name = models.CharField(max_length=20) 
    sku = models.CharField(max_length=10,unique=1) 
    oneoff = models.BooleanField() 
    size = models.CharField(max_length=8, choices=SIZE_CHOICES) 
    servermodels = models.ManyToManyField(ServerModel) 
    #Returns a string containing the platforms this asset is linked to. 
    def used_on(self): 
     usedon = [] 
     for servermodel in self.servermodels.all(): 
      usedon.append(servermodel.__str__()) 

     return ", ".join(usedon) 
    def __unicode__(self): 
     return self.size 


class RamConfig(models.Model): 
    size = models.CharField(max_length=5, verbose_name="Configuration Size") 
    description = models.CharField(max_length=30) 
    servermodel = models.ForeignKey(ServerModel, verbose_name="Server Model") 
    assets = models.ManyToManyField(Asset, through='RamConfigPart') 

    def __unicode__(self): 
     return self.size 

    def total_parts(self): 
     return self.assets.all().count() 



class RamConfigPart(models.Model): 
    SIZE_CHOICES = (
     ('512MB', '512MB'), 
     ('1GB', '1GB'), 
     ('2GB', '2GB'), 
     ('4GB', '4GB'), 
     ('8GB', '8GB'), 
     ('16GB', '16GB'),) 
    config_size = models.CharField(max_length=8, choices=SIZE_CHOICES) 
    ramconfig = models.ForeignKey(RamConfig) 
    asset = models.ForeignKey(Asset) 
    quantity = models.PositiveIntegerField() 
    def __unicode__(self): 
     return self.asset.name 

    class Meta: 
     unique_together = ['ramconfig', 'asset'] 

ありがとう:]

答えて

0

私があなただったら、私はそのモデルの構造を再思うだろう。そして、あなたの問題は、RAMがどれくらいのRAMといくつのスロットをサーバー上に占有するかを表すことであれば、それを解決するために2つのフィールドを使用します。

は、次に、あなたのUnicodeの方法でのような何かができる:

それは、指定された構成のために使用することができるもの棚卸資産返すためだけのツールです
def __unicode__(self): 
    return "%s GB (%s)" % (self.ram, self.slots) 
+0

。サーバーに1GBのDIMMが1枚必要な場合は、そのサーバーで使用できる1GBのアセットすべてを返却したいと考えています。 これは次のようなものです: ユーザー:Heya、Optiplex220用に4GBのRAMが必要です サーバー:素晴らしいですが、(1)4GBのDIMMが必要です。 Optiplex220に適用される1GB DIMMは、4431-1331,3323-1312または1121-5554です。 チップをありがとうございます。 – Zee

関連する問題