2012-02-26 69 views
1

Django新手問題。我有以下型號:django多對多的關係:如何刪除項目,但不刪除它們從相關模型

class Leg(models.Model): 
    drive_date = models.DateField() 
    startpoint = models.CharField(max_length=50) 
    endpoint = models.CharField(max_length=50) 
    start_time = models.TimeField() 
    riders = models.ManyToManyField(Rider, blank=True) 
    drivers = models.ManyToManyField(Driver, blank=True) 
    carpool = models.ForeignKey(Carpool, blank=True, null=True) 

的腿某些情況下,我想從腿模型刪除任何現有的乘客和司機,而不是分別從騎士或驅動程序模型(未顯示)將其刪除。無法弄清楚如何去做。當我迭代:

​​3210

它似乎刪除實際的驅動程序對象,我不想這樣做。

任何幫助,非常感謝。謝謝!

回答

1

我可能會採取的一種方法是爲Driver模型創建一個自定義管理器。下面未經測試的代碼:

from django.db import models 

class DriverManager(models.Manager): 
    def get_query_set(self): 
     return super(DriverManager, self).get_query_set().filter(removed=False) 

class Driver(models.Model): 
    # new stuff to add ... 
    removed = models.BooleanField(default=False) 
    objects = models.Manager() # default manager 
    active = DriverManager() # custom manager 

說明:新字段,removed,被添加到駕駛者模型。您不必刪除記錄,而是將其設置爲True並保存。然後,在你通常過濾Driver.objects的地方,改用Driver.active。

+0

非常感謝您的答覆。看起來,在你提供的例子中,司機可能會被「移除」或「不移除」,這將適用於所有的腿。但是我需要驅動程序僅在Leg的某些實例中被移除,但仍然存在其他實例,所以我不確定它是否可行。但我會試一試。再次感謝。 – mb52089 2012-02-26 23:40:59

+0

對不起,我以爲你想選擇性地從腿上刪除驅動程序,但不刪除它們。 在你的情況下,只分配leg.drivers =無,然後leg.save()。 – 2012-02-27 11:48:27

+0

再次感謝。我認爲這很簡單。 – mb52089 2012-02-27 19:16:34

10

正確的代碼刪除的項目從關係是:

for driver in leg.drivers.all(): 
    leg.drivers.remove(driver) 
0

做這個

leg.drivers.clear() 

.clear() to completely remove completely(efficiently) 
.remove(<related obj>) to remove one relation 
.remove([<related obj>, <related obj>...]) to remove one or more relation