当Django ORM中的其他表发生变化时,更新一个表



Models.py

# store the number of new Videos that added to a Album
class Badge(models.Model):
user_id = models.IntegerField()  # the user you wanna inform
album_id = models.IntegerField()
count = models.IntegerField(blank=True, null=True)
update_time = models.DateTimeField(blank=True, null=True)
# a Album has several videos in it, and will be updated 
class Album(models.Model):
title = models.CharField(max_length=100, default='', null=True)
update_time = models.DateTimeField(blank=True, null=True)
class Video(models.Model):
title = models.CharField(max_length=100, default='', null=True)
aid = models.ForeignKey(Album, on_delete=models.CASCADE, default='')
update_time = models.DateTimeField(blank=True, null=True)

假设在数据库中:

相册表:

357 Learning_Django 2018-07-02 12:40:03.041558

视频表:

1 Install_Python 357 2018-07-02 12:40:03.041558
2 Install_pip 357 2018-07-02 12:40:03.041558
3 Install_Django 357 2018-07-02 12:40:03.041558

现在,两个新的视频已经插入到视频表中:

1 Install_Python 357 2018-07-02 12:40:03.041558
2 Install_pip 357 2018-07-02 12:40:03.041558
3 Install_Django 357 2018-07-02 12:40:03.041558
4 Create_Django_Project 357 2018-07-13 08:40:03.041558
5 Define_Django_Models 357 2018-07-13 08:40:03.041558

我应该怎么做才能让这个更新反映在徽章表上(插入/更新记录(,比如:

1 001 357 2 2018-07-13 08:40:03.041558

这意味着专辑#357已经更新了2个视频,它将通知用户#001。

谢谢你的帮助。

我认为信号就是你需要的,像这个一样的演示

signals.py:

from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import User, Video, Badge
@receiver(post_save, sender=Video)
def create_badge(sender, instance=None, created=False, **kwargs):
if created:
badge, is_created = Badge.objects.get_or_create(user_id='user id you want inform', album_id=instance.aid.id, defaults={'count': 0})
badge.count += 1
badge.save()

apps.py:

from django.apps import AppConfig

class UserConfig(AppConfig):
name = 'user'
def ready(self):
import user.signals

__init__.py:

default_app_config = 'user.apps.UserConfig'

将User或User更改为您自己的app_name

正如@Ykh所说,信号是最好的方式。

也可以使用模型的save方法。您可以在文档中查看更多详细信息

这是演示(实际上我不明白你想做什么,所以这只是参考(

class Video(models.Model):
title = models.CharField(max_length=100, default='', null=True)
aid = models.ForeignKey(Album, on_delete=models.CASCADE, default='')
update_time = models.DateTimeField(blank=True, null=True)
def save(self, *args, **kwargs):
# do this only when created
if not self.pk:
# do something you want like
badge, is_created = Badge.objects.get_or_create(user_id='user id you want inform', album_id=self.aid.id, defaults={'count': 0})
badge.count += 1
badge.save()
super().save(*args, **kwargs)

最新更新