基于现有字段的Django查询集更新

时间:2015-07-01 08:56:46

标签: python django django-queryset

我需要以这样的方式更新Django queryset bookings_to_save

for booking in bookings_to_save:
    booking.status = Booking.STATUS_CHOICES.approved
    booking.title = 'ST{}{}'.format(booking.pk, booking.created.strftime('%Y%m%d'))
    booking.save()

我试过这样的事情:

bookings_to_save.update(
    status=Booking.STATUS_CHOICES.approved,
    title='ST{}{}'.format(F('id'), F('created'))
)

在SQL中,我会这样做:

update bookings_booking bb set title='ST' || bb.id || to_char(bb.created, 'YYYYMMDD') where << some condition >>;

有什么办法可以使用django工具完成这项任务?

1 个答案:

答案 0 :(得分:1)

根据似乎尚不支持的https://docs.djangoproject.com/en/1.7/ref/models/queries/#supported-operations-with-f。理想情况下它看起来像:

bookings_to_save.update(
    status=Booking.STATUS_CHOICES.approved,
    title='ST' + F('id') + F('created'))
)

因为支持的操作是F上的运算符(F需要成为外表达式的一部分以形成F表达式)。

还可以想象一种新的字符串表达式(S表达式;对不起Lisp读者):

bookings_to_save.update(
    status=Booking.STATUS_CHOICES.approved,
    title=S('ST{}{}', F('id'), F('created')))
)