Django обновление булевого поля в сигнале (pre_save)
Я пробовал .update()
и .save(updated_fields=list(kwargs.keys()))
, но изменения не сохраняются.
все выглядит хорошо, когда я прохожу через него в режиме отладки, затем он возвращается обратно для теста. Я работаю с отдельной копией или кэширование - это вещь, которую я должен проверить?
в tests/test_status_model.py
def test_status_set_tag_info_obsolete(self):
""" check to see if the creation of a statusInfo
object which runs a pre_save signal changes
the soon_to_be_obsolete_tag to is_obsolete=True
"""
self.assertFalse(self.soon_to_be_obsolete_tag.is_obsolete)
self.main_status_info = StatusInfoFactory(
affected_tag=self.soon_to_be_obsolete_tag,
status="o", # obsolete
by=self.new_replacement_tag,
)
self.assertTrue(self.soon_to_be_obsolete_tag.is_obsolete) # fails
в status/models.py
@receiver(pre_save, sender=StatusInfo)
def status_change_modification(sender, instance, *args, **kwargs):
"""
Changes tags and concepts to be obsolete or deprecated.
if a tag is obsolete or deprecated, all of the tag's concepts are obsolete or deprecated
"""
assert hasattr(instance.affected_tag, "id")
# set up variables
kwargs = {}
if instance.status == "d":
kwargs["is_deprecated"] = True
elif instance.status == "o":
kwargs["is_obsolete"] = True
if instance.affected_tag_or_concept == "t": # Yes this works
inner_tag_status_change(instance, **kwargs)
def inner_tag_status_change(instance, **kwargs):
"""
update the is_updated fields for status_info
kwargs is either:
kwargs = {'is_obsolete': True} # or {'is_deprecated': True}
"""
affected = Tag.objects.filter(id=instance.affected_tag.id).first()
affected.__dict__.update(**kwargs)
affected.save(update_fields=list(kwargs.keys()))
Я думаю, что это самая маленькая информация, которую я могу получить здесь, чтобы проблема имела смысл. Дайте мне знать, если я что-то упустил.