2016-12-16 95 views
1

我想刪除布塞和配置文件之間的關係:由於ForeignKey的刪除ForeignKey的關係

不允許我不得不重複空值(性能是可怕的!)這樣,除去所有關係:

for u in user.profile_set.all(): 
    u.delete() 



class Profile(models.Model): 
    user = models.ForeignKey('BUser') 

class BUser(AbstractBaseUser, PermissionsMixin): 
    username = models.CharField(max_length=40, unique=True) 

還有一種方法可以刪除所有關係[具有更好的性能]? 我已經試過:

obj.transparentprofile_set = None 
obj.transparentprofile_set.clear() 
obj.transparentprofile_set.empty() 

但是,就像我說的,因爲有沒有我不能使用它們的ForeignKey的null=True

+3

您是否在尋找'user.profile_set.all()刪除()'.. – Sayse

+0

對於批量刪除Dajngo [如何讓Django的查詢集批量刪除()更高效(HTTP ://堆棧溢出。 com/questions/4867852/how-to-make-django-queryset-bulk-delete-more-efficient) – shady

+0

你想保留沒有任何鏈接到用戶的配置文件嗎? – AKS

回答

0

你可以用我的方式,而不是通過虛線ORM孩子的等objects.childs_set觸摸相關模型,其更清晰可讀的代碼:

# Get user instance 
user = User.objects.get(pk=<uid>) 
# Remove profiles 
Profile.objects.filter(user=user).delete() 

另外,你需要記住related_name模型參數,所以不是profile_set你可以使用:?

class Profile(models.Model): 

    user = models.Foreignkey(
     to=User, 
     related_name='profiles' 
    ) 

    # Use related name alias in code 
    profiles = user.profiles.all() 
    profile = user.profiles.filter(pk=<profile_id>)