下面是我的Django模型。我想写一个signal,它将执行以下操作:
1.用户更新包含3个Spider对象的项目。
1.每个Spider对象都包含config_file,因此信号应获取所有Spider对象的列表,并从列表中的所有配置文件中更新组。
1.最后,当用户更新Project中的组名时,所有config_files
也应该更改组名。
class Project(models.Model):
name = models.CharField(max_length=200, default="")
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, default='')
is_shared = models.BooleanField(default=False)
group = models.ForeignKey(Group, on_delete=models.CASCADE, null=True, blank=True, default=1)
class Spider(models.Model):
name = models.CharField(max_length=200, default="", unique=True)
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, default='')
project = models.ForeignKey(Project, on_delete=models.CASCADE, blank=True, null=True, related_name='project_spider')
config_file = models.ForeignKey(BaseFileModel, on_delete=models.SET_NULL, null=True, default='')
class BaseFileModel(models.Model):
file = models.FileField(upload_to=custom_upload_files, null=True, default='')
group = models.ForeignKey(Group, on_delete=models.CASCADE, null=True, blank=True, default=1)
version = models.IntegerField(default=1)
我尝试写入pre_保存信号,但它不像预期的那样工作,因为BaseFileModel中的文件字段在spider.config_file.save()
之后为null,并且不是所有配置文件都更新了组。
我遇到的问题是BaseFileModel和Project之间没有直接的连接,我不知道如何在更新项目组后编写查找/查询来更新所有配置文件。
@receiver(pre_save, sender=Project)
def update_spiders_group(sender, instance, **kwargs):
if instance.pk:
try:
old_project = Project.objects.get(pk=instance.pk)
except Project.DoesNotExist:
pass
else:
if old_project.group != instance.group
spiders = Spider.objects.filter(project=instance)
for spider in spiders:
spider.config_file.group = instance.group
spider.config_file.save()
我将感谢任何帮助如何实现我的目标。
1条答案
按热度按时间blpfk2vs1#
我不确定这个信号是否与您的情况相关,简单的
.save()
覆盖应该足够了。注意,
spider_set__project_id
中的spider_set
是Django生成的默认related_name
,因为您没有为Spider
中的BaseFileModel
FK指定一个