Je dois garder trace de la date à laquelle un utilisateur a été mentionné dans un post et mettre à jour ce champ chaque fois qu'un nouveau message est créé en fonction de son heure de publication.Comment éviter les conditions de concurrence dans la mise à jour du champ de modèle à l'horodatage le plus récent
Mon code actuel ressemble à ceci:
from django.db.models.signals import post_save
from django.dispatch import receiver
from messageboard.models import Post
@receiver(post_save, sender=Post)
def user_last_mentioned_updater(sender, instance, **kwargs):
for users in instance.mentions:
user.last_mentioned = max(user.last_mentioned, instance.timestamp)
user.save()
Toutefois, si deux postes sont traités en même temps, cela pourrait laisser le champ last_mentioned
à l'horodatage du précédent post.
Malheureusement, F
ne supporte pas la, opération max
quand je l'essayer je reçois un TypeError: unorderable types: datetime.datetime() > F()
:
user.last_mentioned = max(F('last_mentioned'), instance.timestamp)
Comment puis-je éviter cette condition de course?
Si cela est important, j'utilise pour le moment Postgresql pour l'ORM, bien que cela puisse changer.
Merci, cela a parfaitement fonctionné. – AJMansfield