我的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重新启动后解决。不知道为什么。但是,谢谢你们所有人。
这可能是因为关系被删除,你认为这是相关myfiles的? –
@ElwinArens否,如果用户删除,所有文件也被删除。 – BAE
问一个愚蠢的问题:您是否记得在更改外键后执行makemigrations并迁移? – e4c5