有什么方法可以改善这个python函数吗?

时间:2010-06-30 19:54:30

标签: python django function

def __number():
    # This line returns the number of the latest created object
    # as a "Factura" object in format "n/year"
    last = Factura.objects.filter(f_type__exact=False).latest('number')

    # We convert it into a string and split it to get only the first number
    spl = str(last).split('/')[0]

    # Convert it into integer so we can do math
    n = int(spl)

    # Get the current year
    y = date.today().strftime('%y')

    # If none return 1/year
    if n == None:
        return str(1) + '/' + str(y)

    # Else we increment the number in one.
    else:
        n = n + 1
        return str(n) + '/' + str(y)

它的作用:它以'1 / year''2 / year'等格式自动生成一个数字。如果用户引入其他数字,p.e。 564/10功能跟随它,下一个将是565/10。

即使用户介绍p.e.在以564/10输入后的34/10,该功能将遵循最大的数字。

我做得对吗或有更好的方法吗?


更新

def __number():
    current_year = date.today().strftime('%y')
    try:
        facturas_emmited = Factura.objects.filter(f_type__exact=False)
        latest_object = facturas_emmited.latest('number').__str__()
        first_number = int(latest_object.split("/")[0]) + 1
    except Factura.DoesNotExist:
        first_number = 1
    return '%s/%s' % (first_number, current_year)

3 个答案:

答案 0 :(得分:2)

这只是一个开始,但我首先要用自我记录代码替换一些注释。

def __number():
    # "Factura" object in format "n/year"
    latest_object = Factura.objects.filter(f_type__exact=False).latest('number')

    # Better name can be available if you explain why the first number is important and what it means
    # Do Factura objects not have a __repr__ or __str__ method that you must cast it?
    first_number = int(str(latest_object).split('/')[0])
    current_year = date.today().strftime('%y')
    # Use "is None" rather than "== None"
    if first_number is None:
        return '1/%d' % current_year
    # No else needed because of return above
    # Why do we add 1 to first number? Comments should explain _why_, not how
    return '%d/%d' % (first_number + 1, current_year)

答案 1 :(得分:1)

last可以None吗?如果是这样,最好检查一下:

# get last as before

if last:
    n = int(str(last).split("/")[0]) + 1
else:
    n = 1

# get y as before

return str(n) + "/" + str(y)

这里的另一个改进是你只在一个地方构建结果字符串。

我不知道Factura对象是什么,但是你可以通过调用它上面的方法获得n的值吗?这比将其转换为字符串,拆分并占据最后一部分更好。

答案 2 :(得分:0)

我前段时间使用object.id/year解决了类似的问题(其中object / id是数据库ID)。

它保证这将是唯一的,自动增量的(你不需要n = n + 1,理论上可以导致数据库中的重复值。)

你可以通过覆盖save方法来做到这一点,唯一的技巧是你需要先保存一个对象(id被分配),然后创建id / year number并再次保存(也许有更好的方法可以做这比双重保存)。

def save(self, force_insert = False, force_update = False):
    super(Factura, self).save(force_insert, force_update)
    current_year = date.today().strftime('%y')
    self.identifier = '%s/%s'%(self.id, current_year)
    super(Factura, self).save(force_insert, force_update)