2016-10-07 14 views
0

我的models.py:的Django 1.7和PSQL:on_delete = models.SET_NULL不行

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) 

但是,如果用户删除,所有相关myfiles的还是删除。

有什么想法?感谢

UPDATE

数据库是postgres9.3.5,我使用\ d +迁移前后的检查表的信息,NO差。有线。

# \d+ ui.myproject_myfile; 
                  Table "ui.myproject_myfile" 
    Column |   Type   |       Modifiers        | Storage | Stats target | Description 
--------------+--------------------------+------------------------------------------------------------------+----------+--------------+------------- 
id   | integer     | not null default nextval('ui.myproject_myfile_id_seq'::regclass) | plain |    | 
file   | character varying(500) | not null               | extended |    | 
slug   | character varying(500) | not null               | extended |    | 
user_id  | integer     |                 | plain |    | 
date_created | timestamp with time zone |                 | plain |    | 
date_expired | timestamp with time zone |                 | plain |    | 
expires  | boolean     | not null               | plain |    | 
Indexes: 
    "myproject_myfile_pkey" PRIMARY KEY, btree (id) 
    "myproject_myfile_2dbcba41" btree (slug) 
    "myproject_myfile_e8701ad4" btree (user_id) 
Foreign-key constraints: 
    "myproject_myfile_user_id_a422765c7101118_fk_auth_user_id" FOREIGN KEY (user_id) REFERENCES ui.auth_user(id) DEFERRABLE INITIALLY DEFERRED 
Referenced by: 
    TABLE "ui.myproject_operation" CONSTRAINT "myproject_ope_myfile_id_3f071e8e8361943b_fk_myproject_myfile_id" FOREIGN KEY (myfile_id) REFERENCES ui.myproject_myfile(id) DEFERRABLE INITIALLY DEFERRED 
Has OIDs: no 

UPDATE

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

然后,我发现下面的添加到我的表的内容。但仍然无法工作。如果用户被删除,所有myfiles也会被删除。 “user_id_fk” 外键(USER_ID)参考ui.auth_user(ID)ON DELETE SET NULL

UPDATE

我正在考虑是否要删除这个帖子。问题在VM重新启动后解决。不知道为什么。但是,谢谢你们所有人。

+0

这可能是因为关系被删除,你认为这是相关myfiles的? –

+0

@ElwinArens否,如果用户删除,所有文件也被删除。 – BAE

+0

问一个愚蠢的问题:您是否记得在更改外键后执行makemigrations并迁移? – e4c5

回答

0

on_delete的默认行为会导致所有相关对象被删除;在这种情况下,相关的对象是MyFile。

如果你想保留MyFile的对象,也许考虑通过on_delete=SET_DEFAULT添加默认或使用可调用传递给on_default=SET(callable)

+0

我试过'on_delete = SET(None)',还没有工作。 – BAE

+0

也许尝试使用户模型通用并将字段设置为GenericForeignKey。 您试图实现的功能究竟是什么? – Ant

+0

是的,如何使用户模型通用并将该字段设置为GenericForeignKey。用户模型是django.contrib.auth.User。 – BAE