Should django model object instances be passed to celery?

后端 未结 2 1097
伪装坚强ぢ
伪装坚强ぢ 2020-12-14 16:42
# models.py
from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30         


        
2条回答
  •  情歌与酒
    2020-12-14 17:22

    Yes. If there are millions of records in the database then this probably isn't the best approach, but since you have to go through all many millions of the records, then pretty much no matter what you do, your DB is going to get hit pretty hard.

    Here are some alternatives, none of which I'd call "better", just different.

    1. Implement a pre_save signal handler for your Person class that does the .title() stuff. That way your first_name/last_names will always get stored correctly in the db and you'll not have to do this again.
    2. Use a management command that takes some kind of paging parameter...perhaps use the first letter of the last name to segment the Persons. So running ./manage.py my_task a would update all the records where the last name starts with "a". Obviously you'd have to run this several times to get through the whole database
    3. Maybe you can do it with some creative sql. I'm not even going to attempt here, but it might be worth investigating.

    Keep in mind that the .save() is going to be the harder "hit" to the database then actually selecting the millions of records.

提交回复
热议问题