2016-12-29 3 views
0

я есть модели, как это:Переходы Django. Комплексное обновление

class Model(models.Model): 
    number = models.CharField() 
    category = models.ForeignKey(Category) 
    created_at = models.DateTime() 

Предположим, что мы имеем следующие категории: [A, B1, B2, B3, B4, B5, C]. Мне нужно обновить записи, где category==B2 (~ 2,3 миллиона записей) с любой категорией B2, B3, B4 или B5.

Правило, если для числа n это первый (по заказу created_at поля) подряд запись с category==B2 затем оставить категорию как есть, если это второй раз подряд запись с category==B2 - категория обновления B3, если третье, а затем обновить категорию до B4 и т. д. Если предыдущая запись имеет категорию B2, но текущий имеет категорию A, тогда сбросьте счёт этого счетчика.

+0

Это кажется сложным прийти, чтобы заслужить это собственный сценарий, я не думаю, что вы должны использовать миграции на всех – yorodm

+0

@yorodm почему бы не использовать миграцию, какие минусы ? – Greesha0

+0

Я не говорю «не используйте миграции», я говорю (IMHO), вы должны рассмотреть возможность написания отдельного сценария для выполнения задачи с учетом ее сложности. – yorodm

ответ

0

Ну, это решение я, наконец, используется:

category_to_pks = {} 
b2_models = Model.objects.filter(category=Category.get_b2()) 

for number in b2_models.order_by('number').distinct('number').values_list('number', flat=True): 
    number_models = b2_models.filter(number=number).order_by('created_at') 
    current_year = None 
    current_month = None 
    category_pk = Category.CATEGORY_B2 

    for model in number_models: 
     if model.created_at.year == current_year and model.created_at.month == current_month: 
      if category_to_pks.get(category_pk): 
       category_to_pks[category_pk].append(model.id) 
      else: 
       category_to_pks[category_pk] = [model.id] 

      if category_pk != Category.CATEGORY_B5: 
       category_pk += 1 

      if current_month == 12: 
       current_year += 1 
       current_month = 1 
      else: 
       current_month += 1 

     else: 
      category_pk = Category.CATEGORY_B3 

      current_year = model.created_at.year 
      current_month = model.created_at.month 

      if current_month == 12: 
       current_year += 1 
       current_month = 1 
      else: 
       current_month += 1 

for category_pk, model_pks in category_to_pks.items(): 
    Model.objects.filter(pk__in=model_pks).update(
     category=Category.objects.get(pk=category_pk) 
    ) 
Смежные вопросы