0

選択した「長い名前」を返すために、モデルにメソッドを作成しようとしています。私は明らかに「Model.get_FOO_display()」メソッドを理解していないか、構文の解体を行っています。最終的な計画は、(model_attr='xxx') を使用して (haystack) search_index.py で「長い名前」を取得することです。数時間検索しましたが、うまくいく例は見つかりませんでした。ご提案いただければ幸いです。ありがとう。

モデル.py

new_used = (
    ('n', 'new'),
    ('u', 'used'),
)

broker = (
    ('n', 'No'),
    ('y', 'Yes'),
)

class Flist(models.Model):
    createdate = models.DateTimeField(auto_now_add=True)
    expirydate = models.DateTimeField(null=True, blank=True)
    price = models.IntegerField(null=True, blank=True)
    new_used = models.CharField(max_length=1, blank=True, choices=new_used, default='u')    
    broker_y_n = models.CharField(max_length=1, blank=True, choices=broker, default='n')
    mfr = models.CharField(max_length=80, blank=True)    
    listing_type = models.ForeignKey(ListingType)
    listing_status = models.ForeignKey(ListingStatus, default=3)
    location_zip = models.IntegerField(null=True, blank=True)    
    customer = models.ForeignKey(Customer)

    def nu(self):
        return Flist.get_new_used_display

    def byn(self):
        return Flist.get_broker_y_n_display 

search_indexes.py

class FlistIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)    
    createdate = indexes.DateTimeField(model_attr='createdate', faceted=True)
    price = indexes.IntegerField(model_attr='price',  faceted=True)
    new_used = indexes.CharField(model_attr='nu',  faceted=True)
    broker_y_n = indexes.CharField(model_attr='byn',  faceted=True)
    mfr = indexes.CharField(model_attr='mfr',  faceted=True)
    listing_type = indexes.CharField(model_attr='listing_type',  faceted=True)
    listing_status = indexes.CharField(model_attr='listing_status',  faceted=True)
    location_zip = indexes.IntegerField(model_attr='location_zip',  faceted=True)

    def get_model(self):
        return Flist

質問は続きます.....

「悪い」メソッドをプロパティに変更しました:

    @property
    def nu(self):
       return self.get_new_used_display()

    @property
    def byn(self):
       return self.broker_y_n_display()

haystack が (can't find_ model_attr(ibutes) 'byn' または 'nu' を好まないように見えるため、インデックスを作成しません。

メソッドと @property を始める前は、名前とファセット数を取得していましたが、名前は短いバージョンでした。FlistIndex の model_attr に長い名前を取得するための適切な構文は何ですか?

4

1 に答える 1

2

メソッドによって返される値ではなく、メソッド自体を返しています。つまり、次の代わりに:

def nu(self):
    return self.get_new_used_display

あなたがする必要があります:

def nu(self):
    return self.get_new_used_display()

@DanielRosemanが指摘したように、(インスタンス対クラス)selfの代わりに使用するように編集された上記のコード。Flist

アップデート

また、FWIW、メソッド呼び出しを短いバージョンにラップする場合 (たとえば、.nu()と同等.get_new_used_display()の場合は、それを本当に価値のあるものにして、プロパティに変換することもできます。

@property
def nu(self):
    return self.get_new_used_display()

次に、some_flist.nuモデルの他のプロパティと同じように (括弧なしで注意してください) 実行できます。いずれにせよ問題ではありませんが、その方が少しきれいです。

于 2012-05-09T20:49:45.367 に答える