Архивирование записей и повторная вставка новых записей в Django?

У меня есть таблица Stock и таблица StockArchive.

Моя таблица Stock состоит примерно из 10000 акций, которые я обновляю ежедневно. Причина, по которой у меня есть таблица StockArchive, заключается в том, что я все еще хочу получить некоторые исторические данные, а не просто обновлять существующие записи. Мой вопрос в том, правильно ли я поступаю?

Сначала мои модели:


class Stock(models.Model):
    objects = BulkUpdateOrCreateQuerySet.as_manager()

    stock = models.CharField(max_length=200)
    ticker = models.CharField(max_length=200)
    exchange = models.ForeignKey(Exchange, on_delete=models.DO_NOTHING)
    eod_price = models.DecimalField(max_digits=12, decimal_places=4)
    currency = models.CharField(max_length=20, blank=True, null=True)
    last_modified = models.DateTimeField(blank=True, null=True)

    class Meta:
        db_table = "stock"
    
class StockArchive(models.Model):
    objects = BulkUpdateOrCreateQuerySet.as_manager()

    stock = models.ForeignKey(Stock, on_delete=models.DO_NOTHING)
    eod_price = models.DecimalField(max_digits=12, decimal_places=4)
    archive_date = models.DateField()

    class Meta:
        db_table = "stock_archive"
   

Я продолжаю делать следующее:

@transaction.atomic
def my_func():
    archive_stocks = []
    batch_size = 100
    old_stocks = Stock.objects.all()
    for stock in old_stocks:
        archive_stocks.append(
            StockArchive(
                stock=stock.stock,
                eod_price = stock.eod_price,
                archive_date = date.today(),
            )
        )

    # insert into stock archive table
    StockArchive.objects.bulk_create(archive_stocks, batch_size)

    # delete stock table
    Stock.objects.all().delete()

    # proceed to bulk_insert new stocks

Я также обернул функцию символом @transaction.atomic, чтобы убедиться, что фиксируются все транзакции, а не только одна из них.

Правилен ли мой ход мыслей, или я должен сделать что-то по-другому? Возможно, более эффективно?

Вернуться на верх