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 回答