Django中的复杂信号问题

k5ifujac  于 2023-04-07  发布在  Go
关注(0)|答案(1)|浏览(129)

下面是我的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()

我将感谢任何帮助如何实现我的目标。

blpfk2vs

blpfk2vs1#

我不确定这个信号是否与您的情况相关,简单的.save()覆盖应该足够了。

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)

    def save(*args, **kwargs):
        if self.pk is None:
            return super().save(*args, **kwargs)

        old_group_id = Project.objects.get(pk=pk).group_id

        super().save(*args, **kwargs)

        if old_group_id != self.group_id:
            BaseFileModel.objects.filter(spider_set__project_id=pk).update(group_id=self.group_id)

注意,spider_set__project_id中的spider_set是Django生成的默认related_name,因为您没有为Spider中的BaseFileModel FK指定一个

相关问题