【问题标题】:How to delete a record in Django models?如何删除 Django 模型中的记录?
【发布时间】:2011-04-17 21:13:14
【问题描述】:

我想删除特定记录。比如

delete from table_name where id = 1;

如何在 django 模型中做到这一点?

【问题讨论】:

标签: python django django-models


【解决方案1】:

有几种方法:

直接删除:

SomeModel.objects.filter(id=id).delete()

从实例中删除它:

instance = SomeModel.objects.get(id=id)
instance.delete()

【讨论】:

  • 请注意,第一个不会调用对象的 .delete() 方法,因此如果该方法中有“清理”代码,则不会调用它。通常不是问题,但值得牢记。
  • @Matthew Schinckel:这是真的。如果您想要自定义删除方法,则应该使用 pre_deletepost_delete 信号。
  • 我不知道DJango 1.4之后是什么情况,但这实际上是获取所有PK然后被这些PK删除。因此,例如,如果您通过任意字段删除,这可能会比 SQL 对应项慢得多... :(
  • @VajkHermecz:这是正确的,并且是由于删除信号的预期行为。 Django 信号系统必须跟踪所有数据库更改,因为某些东西可能会与它挂钩(就像 reversion 一样)。
  • 您可以使用delete() 的返回值来检查您要删除的内容。它返回一个包含已删除对象计数的元组和一个包含有关已删除类型的详细信息的字典,例如(1, {'yourapp.SomeModel': 1}).
【解决方案2】:
MyModel.objects.get(pk=1).delete()

如果具有指定主键的对象不存在,这将引发异常,因为它首先尝试检索指定的对象。

MyModel.objects.filter(pk=1).delete()

如果具有指定主键的对象不存在并且直接生成查询,则不会引发异常

DELETE FROM my_models where id=1

【讨论】:

  • 你用过pk,@Wolph用过id。有什么区别?
  • 使用pk,您正在使用表主键进行过滤。我认为@Milad 假设由于@Wolf 使用的是id,他正在搜索主键。通常,如果您在模型中将不同的字段设置为主键,这可能是错误的
  • @Gathide 你可以在 django 中看到 docs.djangoproject.com/en/3.2/topics/db/models/that id = models.BigAutoField(primary_key=True) 因此,如果你没有改变你的模型的默认主键,idpk 有效,因为 *pk 指的是主键。
【解决方案3】:

如果你想删除一个实例然后写代码

entry= Account.objects.get(id= 5)
entry.delete()

如果要删除所有实例,请编写代码

entries= Account.objects.all()
entries.delete()

【讨论】:

    【解决方案4】:

    如果你想删除一项

    wishlist = Wishlist.objects.get(id = 20)
    wishlist.delete()
    

    例如,如果您想删除愿望清单中的所有项目

    Wishlist.objects.all().delete()
    

    【讨论】:

      【解决方案5】:

      delete() 方法用于从数据库中删除模型实例。此方法会立即删除对象。此方法返回已删除对象的数量。

      例子:

      删除一条记录:

      data_to_be_deleted = Modelname.objects.get(fieldname = value)
      data_to_be_deleted.delete()
      

      由于 get 方法从查询集中返回单个对象,因此只会删除单个记录。如果提供的值不存在,这将引发错误。如果表中有多个相同值的记录,那么它也会引发错误,所以好的做法是在使用 get 时使用单个唯一值。

      根据条件删除多条记录:

      在查询集上使用基于条件的删除过滤方法,然后调用删除。

      data_to_be_deleted = Modelname.objects.filter(fieldname = value)
      data_to_be_deleted.delete()
      

      删除所有记录:

      要从数据库表中删除所有模型实例/记录,您需要在 all 上调用 delete 方法

      data_to_be_deleted = Modelname.objects.all()
      data_to_be_deleted.delete()
      

      注意:代码可以单行写成Modelname.objects.all().delete(),但为了清楚起见,我使用了多行。

      【讨论】:

        【解决方案6】:

        通过wolph扩展投票最多的答案

        请注意,您应该将请求作为参数传递给视图中的删除函数。一个例子是:

        from django.shortcuts import redirect
        
        
        def delete(request, id):
        YourModelName.objects.filter(id=id).delete()
        
        return redirect('url_name')
        

        【讨论】:

        • 哪条是“票数最高的评论”?最好是参考它,例如由其作者,因为它可能不会永远保持“顶级”。
        • 嘿,我编辑了我的答案。感谢提及。
        【解决方案7】:

        就这么简单,调用如下。

        SomeModel.objects.get(pk=1).delete()
        # Or
        SomeModel.objects.filter(pk=1).delete()
        
        # SQL equivalent
        # delete from table_name where id = 1;
        

        如果您想根据 id 删除多条记录, 使用__in查询lookup

        SomeModel.objects.fitler(pk__in=[1,2,3,4,5,...]).delete()
        
        # SQL equivalent
        # delete from table_name where id in (1,2,4,5,...);
        

        如果您想删除所有记录,请使用.all() 检索所有查询, 然后.delete()

        SomeModel.objects.all().delete()
        
        # SQL equivalent
        # delete from table_name;
        

        【讨论】:

          【解决方案8】:

          我的做法:

          instance = SomeModel.objects.get(id=1)
          
          instance.delete()
          

          对我来说它看起来很容易理解,这就是我使用这种方法的原因。

          【讨论】:

            【解决方案9】:

            您可以直接从管理面板中删除对象,或者也可以通过键入 python3 manage.py shell(Linux 中的 python3)从交互式 shell 中删除特定或选定的 id。 如果您希望用户通过浏览器(使用提供的可视界面)删除对象,例如数据库中 ID 为 6 的员工,我们可以使用以下代码实现此目的, emp = employee.objects.get(id=6).delete()

            这将删除 ID 为 6 的员工。

            如果您希望删除数据库中存在的所有员工而不是 get(),请指定 all(),如下所示: employee.objects.all().delete()

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-07-12
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多