首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django多对多关系:如何从相关模型中删除项而不是删除项

django多对多关系:如何从相关模型中删除项而不是删除项
EN

Stack Overflow用户
提问于 2012-02-26 10:10:55
回答 3查看 4.4K关注 0票数 1

Django菜鸟问题。我有以下模型:

代码语言:javascript
复制
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)

对于Leg的某些实例,我希望从Leg模型中删除任何现有的骑手和驾驶员,但不会分别从骑手或驾驶员模型(未显示)中删除它们。我不知道该怎么做。当我使用以下命令迭代时:

代码语言:javascript
复制
for driver in leg.drivers.all():
    driver.delete()

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

任何帮助都是非常感谢的。谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-26 12:33:43

我可能采用的一种方法是为驱动程序模型创建一个自定义管理器。下面是未经测试的代码:

代码语言:javascript
复制
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

说明:在Driver模型中添加了一个新字段removed。不是删除记录,而是将其设置为True并保存。然后,在通常情况下过滤Driver.objects的地方,使用Driver.active。

票数 1
EN

Stack Overflow用户

发布于 2013-04-11 18:43:15

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

代码语言:javascript
复制
for driver in leg.drivers.all():
    leg.drivers.remove( driver )
票数 12
EN

Stack Overflow用户

发布于 2016-10-27 14:24:03

执行此操作

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9449931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档