Django - get_FOO_display方法 - 显示选择长名称

时间:2012-05-09 20:45:55

标签: django django-haystack

我正在尝试在我的模型上创建一个方法来返回长名称'我的选择我显然不明白" Model.get_FOO_display()"方法,或正在做一些句法屠杀。最终的计划是抓住长长的名字'在(haystack)search_index.py中使用(model_attr =' xxx')。我已经完成了几个小时的搜索,但没有找到一个有效的例子。我感谢您提供的任何建议。感谢。

Models.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

问题继续.....

好的改变了#34;坏'属性方法:

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

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

看起来干草堆不喜欢(不能找到模特儿(ibutes)' byn'或者'因此赢得了索引。

在开始使用方法和@property之前,我获得了名称和方面的计数,但名称是短版本。在FlistIndex中获取model_attr的长名称的正确语法是什么?

1 个答案:

答案 0 :(得分:2)

您将返回方法本身,而不是方法返回的值,即代替:

def nu(self):
    return self.get_new_used_display

你需要这样做:

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

编辑上面的代码,使用self代替Flist(实例与类),如@DanielRoseman所指出的那样。

<强>更新

另外,FWIW,如果你要将方法调用包装成更短的版本(例如.nu()等同于.get_new_used_display()),那么你也可以将其变为真正有价值并将其转换为属性:

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

然后,您可以像模型上的任何其他属性一样some_flist.nu(没有括号注意)。这种或那种方式并不重要,但这种方式有点清洁。