Django 1.7和PSQL:on_delete=models.SET_NULL n

2024-04-26 21:02:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我的模型.py公司名称:

class MyFile(models.Model):
    file = models.FileField(upload_to="myfiles", max_length=500, storage=OverwriteStorage())
    slug = models.SlugField(max_length=500, blank=True)
    user = models.ForeignKey(User, on_delete=models.SET_NULL, blank=True, null=True,)
    date_created = models.DateTimeField(auto_now_add = True, blank=True, null=True)
    date_expired = models.DateTimeField(default=default_time, blank=True, null=True)
    expires = models.BooleanField(default=True)



    def __str__(self):
        return self.file.name

    @models.permalink
    def get_absolute_url(self):
        return ('myfile:myfile-new', )

    def save(self, *args, **kwargs):
        self.slug = self.file.name
        super(MyFile, self).save(*args, **kwargs)

    def delete(self, *args, **kwargs):
        self.file.delete(False)
        super(MyFile, self).delete(*args, **kwargs)

    class Meta:
        managed = True

@receiver(pre_delete, sender=MyFile)
def remove_file(**kwargs):
    instance = kwargs.get('instance')
    instance.file.delete(save=False)


class Operation(models.Model):
    id = models.AutoField(primary_key = True)
    user = models.ForeignKey(User, blank=True, null=True)
    myfile = models.ForeignKey(MyFile, blank=True, null=True)

    def get_data(self):
        return json.loads(self.data)

    class Meta:
        managed = True

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    subscribe = models.BooleanField(default=True)

    def __unicode__(self):
        return u'Profile of user: %s' % (self.user.username)

    class Meta:
        managed = True

def create_user_profile(sender, instance, created, **kwargs):
    from django.conf import settings
    subscribe = False 
    if created:
        profile, created = UserProfile.objects.get_or_create(user=instance, subscribe=subscribe)

post_save.connect(create_user_profile, sender=User)

但是,如果用户删除了,所有相关的myfile仍然会被删除。在

有什么想法吗?谢谢

更新

数据库是postgres9.3.5,我用\d+检查迁移前后的表信息,没有区别。有线。在

^{pr2}$

更新

#ALTER TABLE ui.myproject_myfile ADD CONSTRAINT user_id_fk FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE SET NULL;

然后,我发现在我的表格描述中添加了以下内容。但还是没用。如果用户删除,则所有我的文件也将被删除。 “user_id_fk”外键(user_id)引用用户身份验证用户(id)删除时设置为空

更新

我正在考虑是否删除这篇文章。虚拟机重新启动后问题已解决。不知道为什么。但是谢谢你们。在


Tags: instanceselfidtruemodelsdefdeletemyfile
1条回答
网友
1楼 · 发布于 2024-04-26 21:02:20

on_delete的默认行为导致删除所有相关对象;在本例中,相关对象是MyFile。在

如果您试图保留MyFile对象,可以考虑通过on_delete=SET_DEFAULT添加一个默认值,或者使用传递给on_default=SET(callable)的可调用函数

相关问题 更多 >