2016-10-07 8 views
0

マイmodels.pyに動作しない:ユーザーが削除した場合ジャンゴ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ある、と私は、移行前と後のNO違いをテーブルの情報を確認していないために、\ d個の+を使用しました。有線。

# \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も削除されます。 DELETE SET NULLのON "user_id_fk" FOREIGN KEY(USER_ID)REFERENCESのui.auth_user(ID)

UPDATE

私はこの投稿を削除するかどうか考えています。 VMの再起動後に問題が解決しました。いいえ、アイデア理由。しかし、皆さん、ありがとう。

+0

に渡された呼び出し可能の使用を検討し、あなたはそれが関連myfilesということだと思いますか? –

+0

@ElwinArensいいえ、ユーザーを削除すると、すべてのファイルも削除されます。 – BAE

+0

愚かな質問をするには:外部キーを変更した後に、移行を実行して移行することを忘れましたか? – e4c5

答えて

0

on_deleteという既定の動作では、関連するすべてのオブジェクトが削除されます。この場合、関連するオブジェクトはMyFileです。

あなたはMyFileのオブジェクトを維持しようとしている場合は、多分on_delete=SET_DEFAULTを経由して、デフォルトを追加したり、それは関係が削除されている可能性がありon_default=SET(callable)

+0

私は 'on_delete = SET(なし)'を試しましたが、まだ動作していません。 – BAE

+0

UserモデルをGenericにして、そのフィールドをGenericForeignKeyとして設定してみてください。 達成しようとしている機能は何ですか? – Ant

+0

はい、UserモデルをGenericにして、そのフィールドをGenericForeignKeyとして設定する方法。ユーザモデルはdjango.contrib.auth.Userです。 – BAE