41👍
To update an existing rating, you actually have to have the one you want to update. If you know the object may not exist, use get_or_create
:
rate, created = VideoRate.objects.get_or_create(user_id=1, video_id=1, crit_id=1)
rate.rate = 2
rate.save()
You can short-cut the process by using update()
:
VideoRate.objects.filter(user_id=1, video_id=1, crit_id=1).update(rate=2)
But this will silently fail if the rating does not exist – it won’t create one.
10👍
First, you must check if the rating exists. So you may either use what Daniel Roseman said or use exists, but you can not solve this with a simple update since update do not create new records…
rating = 2
rate, created = VideoRate.objects.get_or_create(user_id=1, video_id=1, crit_id=1,
defaults={'rate':rating})#if create, also save the rate infdormation
if not created:# update
rate.rate = rating
rate.save()
You can use defaults to pass exrta arguments, so if it is an insert, database record will be created with all required information and you do not need to update it again…
Update: This answer is quite old just like the question. As @peterthomassen mention, Django now have update_or_create() method
- [Django]-How do you serialize a model instance in Django?
- [Django]-How to get value from form field in django framework?
- [Django]-Django: add image in an ImageField from image url
3👍
Django 4.1 has added the support for such conflicts. In the backend, it runs a INSERT...ON DUPLICATE KEY UPDATE
query.
Example of above in a single query:
rate = VideoRate(user_id=1, video_id=1, crit_id=1, rate=2)
rate.save()
# updating rate object if it exists, else create one
rate = VideoRate(user_id=1, video_id=1, crit_id=1, rate=3)
VideoRate.objects.bulk_create(
[rate],
update_conflicts=True,
update_fields=['rate']
)
- [Django]-Default filter in Django model
- [Django]-Django: 'current_tags' is not a valid tag library
- [Django]-How to get the username of the logged-in user in Django?