2016-11-29 2 views
0

У меня есть приложение Джанго (1,8) Вот часть моей модели:код должен возвращать значение мин, но это не

price_1 = models.DecimalField(max_digits=6, decimal_places=0, null=True, help_text='price_1') 
price_2 = models.DecimalField(max_digits=6, decimal_places=0, null=True, help_text='price_2') 
price_3 = models.DecimalField(max_digits=6, decimal_places=0, null=True, help_text='price_3') 
price_4 = models.DecimalField(max_digits=6, decimal_places=0, null=True, help_text='price_4') 
price_5 = models.DecimalField(max_digits=6, decimal_places=0, null=True, help_text='price_5') 
price_6 = models.DecimalField(max_digits=6, decimal_places=0, null=True, help_text='price_6') 
price_7 = models.DecimalField(max_digits=6, decimal_places=0, null=True, help_text='price_7') 

Вот мой метод в модели:

def min_prices(self): 
    prices = [self.price_1, self.price_2, self.price_3, self.price_4, self.price_5, self.price_6, self.price_7] 
    return min(['{0}'.format(i) for i in prices if i is not None]) 

Мои значения в модели:

price 1: 4000 
price 2: 2800 
price 3: 1800 
price 4: 900 

Мой код должен вернуть 900, но у меня 1800, и я не понимаю почему.

+2

С ' '{0}' формате (I) 'вы конвертируете целые числа в строки! –

ответ

4

Функция min выполняет сравнение строк, а не цифр, и поэтому возвращает наименьшее по алфавиту.

Try:

return str(min([price for price in prices if price])) 
+0

Работает, спасибо. –

0

необходимо преобразовывать строки в целые числа:.

>>> prices = [4000, 2800, 1800, 900] 
>>> min(['{0}'.format(i) for i in prices if i is not None]) 
'1800' 
>>> min([int('{0}'.format(i)) for i in prices if i is not None]) 
900 
0

Это работало для меня

>>> prices = [4000, 2000, 1800,900] 

>>> '{}'.format(min(prices)) 

'900' 
+0

Несмотря на то, что он отлично подходит для вас ... это не объясняет, – Sayse

Смежные вопросы