gpt4 book ai didi

django - 在保存期间标记 django 模型实例以供以后处理

转载 作者:行者123 更新时间:2023-12-04 07:15:44 25 4
gpt4 key购买 nike

我在使用标志来标记模型实例以供将来处理时遇到问题。我有一个类:

class MyModel(models.Model):
processed = models.BooleanField(default=False)
changed = models.DateTimeField(auto_now=True)
# More fields.

def save(self):
self.processed = False
super().save(*args, **kwargs)

然后我有一个管理命令:
class Command(BaseCommand):

def handle(self, *args: Any, **kwargs: Any) -> None:
models = MyModel.objects.filter(processed=False).order_by("changed")[:200]
for model in models:
# Do some processing
model.processed = True
model.save()
现在,很明显,当模型被保存时,它只是将实例重新标记为未处理。
我是 Django 的新手,所以我对模型生命周期和可用方法的了解非常有限。我一直在阅读文档,到目前为止还没有找到任何解决方案。
关于我如何解决这个问题的任何想法?

最佳答案

解决这个问题的最好方法可能是添加一个参数来忽略标记:

class MyModel(models.Model):
processed = models.BooleanField(default=False)
changed = models.DateTimeField(auto_now=True)
# More fields.

def save(self, *args, unset_processed=True, **kwargs):
if unset_processed:
self.processed = False
super().save(*args, **kwargs)
然后在您的基本命令中,我们可以使用:
class Command(BaseCommand):

def handle(self, *args: Any, **kwargs: Any) -> None:
models = MyModel.objects.filter(processed=False).order_by("changed")[:200]
for model in models:
# Do some processing
model.processed = True
model.save(unset_processed=False)
但请注意,批量创建、更新等将绕过调用 .save(…)在模型上。因此,如果您例如使用:
MyModel.objects.filter(pk__in=[1,4,2,5]).update(some_field=some_value)
例如不会调用 .save(…)方法。 documentation on .update(…) [Django-doc]例如声明:

Finally, realize that update() does an update at the SQL level and,thus, does not call any save() methods on your models, nor doesit emit the pre_save or post_save signals

(…)

If you want to update a bunch of records for a model that has a customsave() method, loop over them and call save(), like this:

for e in Entry.objects.filter(pub_date__year=2010):
e.comments_on = False
e.save()

关于django - 在保存期间标记 django 模型实例以供以后处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68777019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com