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)

对于某些腿部实例,我想从腿部模型中删除任何现有的骑手和车主,但不会分别从骑手或车主模型(未显示(中删除他们。 不知道该怎么做。 当我迭代时:

for driver in leg.drivers.all():
    driver.delete()

它似乎删除了实际的驱动程序对象,我不想这样做。

任何帮助将不胜感激。 谢谢!

从关系中删除项的正确代码是:

for driver in leg.drivers.all():
    leg.drivers.remove( 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。

这样做

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

最新更新