2012-02-26 58 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 
相关问题